生成一个30个字符的代码的哈希函数?

4
我需要将一条消息哈希成一个30个字符的字符串。对于这种用途,最好且最安全的哈希函数是什么?

如果您说明哈希函数的要求,这会有所帮助... - tc.
2
如果您只想让它生成实质上是随机的数据“唯一ID”,或者仅由可信赖的人创建,则哈希算法不需要具备抗碰撞能力。如果您在上下文中使用它来“证明”具有相等哈希值的数据相等,并且该数据可能是恶意生成的冲突,则标准做法是使用SHA-256或SHA-512,因为MD5完全被破解(可以随意生成冲突),而SHA-1在未来可行性方面并不是非常具有前瞻性,因为攻击似乎正在稳步接近。 - Steve Jessop
2个回答

9

三十个字符(字节)是240位。

如果不能把目标设为32个字符,那么你可能会使用SHA-1,它生成160位或20个字节。经过Base-64编码后,长度为28个字符。如果使用十六进制编码,则长度将达到40个字符,超出了正常范围。如果使用32个字符,则可以使用SHA-256,但Base-64编码将增加该大小(至44个字符),并且十六进制编码将使大小增加至64个字符。

如果您必须使用十六进制编码,并且可以使用32个字节,则可以使用MD5(生成128位),但不建议在任何新系统中使用。通过Base-64编码,MD5使用24个字符。否则,您将使用非常低安全性的算法,根本不推荐使用。


4
另一种选择是使用base64-SHA-256的前30个字符,这比SHA-1更安全。您还可以查阅http://en.wikipedia.org/wiki/Ascii85,其中30个字符可以容纳192位的熵。 - tc.

6
只需使用SHA1并将其裁剪为30个字符即可。
import hashlib
hash = hashlib.sha1("your message").hexdigest()[:30]

已经证明,截断一个加密安全哈希函数(如SHA1)的字符对其安全性几乎没有影响(虽然现在无法找到参考文献)。

对于好的哈希函数,指数越大,安全性就会降低。例如,在40个字符的SHA1十六进制摘要中找到碰撞需要2^80次暴力破解,因此在前30个字符中找到碰撞只需要“仅有”的2^60次暴力破解。目前已知的最佳碰撞攻击SHA1的方法实际上只有大约2^51,而不是2^80。我不知道是否可以采用这种方法在少于2^51次尝试中找到前120位的碰撞。然而,造成这种差异的原因是:至少在碰撞问题上,SHA1不再是一个“具有密码学安全性”的哈希函数。 - Steve Jessop
@tc 你是怎么想到“60位”的? - quantumSoup
2
@Steve 2^60是一个非常大的数字。这比宇宙年龄的秒数还要多。而且,SHA1仍被认为是一种具有密码学安全性的哈希函数,因为2^51步骤仍然无法通过暴力破解。此外,找到一种以更少的步骤生成整个哈希碰撞的方法并不意味着可以用同样的方法来生成前120位。 - quantumSoup
4
希望那些对密码学一无所知的人能够停止对他们几乎不了解的答案进行负评。天哪! - quantumSoup
@tc "SHA-1的碰撞很快就会被发现。" 你为什么这么认为? - quantumSoup
显示剩余3条评论

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