最大熵的最小密码长度

4
假设使用SHA 256哈希和扩展ASCII字符集的完全随机密码,是否存在一个特定的长度,在此之后,额外的字符不会增加熵?如果有,请问这个长度是多少?
谢谢。

3
扩展ASCII是一个不准确的称呼:http://en.wikipedia.org/wiki/Extended_ASCII - user611775
扩展ASCII包括从80到FF(十六进制)的字符,包括这个范围。是的,我计划将密码存储为哈希值。编辑:正如上面提到的那样,这是一个错误的术语。抱歉。 - Michael
解决 x = 256 / b。对于 BASE64,b 将是 log2(64)=6。 - user611775
1
@larsmans:存储明文密码何时成为可取之事?或者说,以可逆的方式存储呢? - Oliver Charlesworth
1
@larsmans:这就是为什么标准做法是将用户密码与盐值的组合进行哈希处理。 - Oliver Charlesworth
显示剩余4条评论
4个回答

4

SHA-256算法具有256位,显而易见。UTF-8编码中,字符的最小长度为1字节,即8位。因此,任何超过256/8=32个字符的密码都极有可能与较短的密码发生碰撞。

这是您想表达的意思吗?


是的,那就是我的意思。我很抱歉修改了原帖并质疑SHA 256和扩展ASCII。 - Michael
2
我认为SHA-256对于每个小于或等于256位的输入值不是双射的。 - Gumbo
@Gumbo,如果你是正确的,那么这个答案和Jerry的答案都是完全误导的... - Mark Eirich
@Mark:这些答案并不是真正误导。从信息论的角度来看,一个N位的字符串最多可以存储N位信息(因此在SHA-256的情况下最多可达256位)。随机生成的N位字符串恰好存储N位信息,因此截取它(即使进行转换)必须必然丢失信息(即熵)。 - Oliver Charlesworth
@Oli:抱歉在我的评论中进行了个人攻击! - Mark Eirich
显示剩余5条评论

4

哈希并不能增加熵,它只是将熵提炼出来。由于SHA256生成256位的输出,如果你提供的密码是完全不可预测的(即每个输入位代表一位熵),那么超过256位的输入就几乎是浪费的。

除了真正的随机源之外,很难获得每个输入位都具有一位熵的输入。对于典型的英文文本,香农的测试显示每个字符大约有一位熵。


3
我得出的结论与其他人大致相同,但理由不同。
一般来说,对SHA-256进行预映像(暴力)攻击需要2^256次尝试,无论密码长度如何。换句话说,一个数千个字符长的“密码”的哈希值仍然需要平均2^256次尝试才能复制。 2^256约为1.2 x 10^77。但是,非常短的密码,其可能性小于2^256,更容易被破解。 当可能性大于2^256时,阈值就会超过。 如果您使用ISO 8859-1,该字符集有191个字符,则长度为n的密码具有191^n种可能的随机密码。 191^33约为1.9 x 10^75,而191^34约为3.6 x 10^77,因此阈值将在33个字符处。
如果您使用纯ASCII,有128个字符,则长度为n的密码具有128^n种可能的随机密码。 128^36约为7.2 x 10^75,而128^37约为9.3 x 10^77,因此阈值将在36个字符处。
其他答案中的一些似乎意味着阈值始终为32个字符。但是,如果我的逻辑是正确的,阈值取决于字符集中的字符数
事实上,假设您仅使用字符a-z和0-9,您将继续增加密码强度,直到密码长度为49个字符!(36^49约为1.8 x 10^76)
希望这个答案为您回答问题提供了数学基础。
顺便说一句,如果SHA-256存在生日(冲突)攻击,则理论上只需要2^128次尝试(平均值),约为3.4 x 10^38。在这种情况下,ISO 8859-1的阈值仅为16个字符(191^16约为3.1 x 10^36)。幸运的是,尚未公开展示这样的攻击。
请参见维基百科关于 SHA-2 预映像攻击生日攻击的文章。

1

我认为没有“有效”的限制。只要密码被有效地创建(通常规则,不使用单词,混合数字、字母、大小写和字符),任何长度的密码都是有效的。最好强制用户遵循这些规则而不是限制长度。但应该强制实施最小长度,例如8-10个字符,以保护用户免受自己的伤害。


1
这可能适用于人为选择的密码。但是就“随机”密码而言,我认为OP所说的是信息论上的熵。 - Oliver Charlesworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接