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

Algorithm 哈希函数生成一个30个字符的代码?,algorithm,encryption,hash,string-hashing,Algorithm,Encryption,Hash,String Hashing,我需要将一条消息散列成30个字符的字符串。对于这种用法,什么是最好和最安全的哈希函数?只需使用SHA1并将其修剪为30个字符 import hashlib hash = hashlib.sha1("your message").hexdigest()[:30] 已经证明,从加密安全的散列函数(如SHA1)中删除字符对其安全性的影响可以忽略不计(尽管现在找不到引用)三十个字符(字节)是240位 如果您不能将目标帖子移动到允许32个字符,那么您可能会使用SHA-1,它生成160位或20字节。当Ba

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

只需使用SHA1并将其修剪为30个字符

import hashlib
hash = hashlib.sha1("your message").hexdigest()[:30]
已经证明,从加密安全的散列函数(如SHA1)中删除字符对其安全性的影响可以忽略不计(尽管现在找不到引用)

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

如果您不能将目标帖子移动到允许32个字符,那么您可能会使用SHA-1,它生成160位或20字节。当Base-64编码时,将是28个字符。如果使用十六进制编码,它将是40个字符,这在名义上超出了范围。对于32个字符,您可以使用SHA-256,但Base-64编码将增加该大小(到44个字符),而十六进制编码将该大小增加到64个字符


如果您必须使用十六进制编码,并且可以达到32字节,那么可以使用MD5(生成128位),尽管不建议将其用于任何新系统。对于Base-64编码,MD5使用24个字符。否则,您将使用非常安全的算法—根本不推荐使用。

SHA-1的碰撞可能很快就会被发现。如果您不关心碰撞阻力,MD5就足够了。如果你这样做了,那么被截断的散列只有60位的安全性,这不是很多。当然,对于好的散列,它会按指数的比例降低安全性。例如,在一个40个字符的SHA1 hexdigest上查找冲突的暴力行为是2^80,因此在前30个字符上查找冲突的暴力行为“仅”是2^60。最著名的SHA1碰撞攻击实际上只是2^51,而不是2^80。我不知道这种方法是否可以在不到2^51的时间内找到第一个120位的碰撞。然而,造成这种差异的原因是:SHA1不再是一个真正的“加密安全”散列函数,至少在冲突很重要的情况下是这样。@tc你是如何想出“60位”的?@Steve 2^60是一个巨大的数字。这比几秒钟内宇宙的年龄还要大。是的,SHA1仍然被认为是一个加密安全的散列函数,因为2^51步仍然不可能用暴力实现。此外,找到一种在较少的步骤中为整个哈希生成冲突的方法并不能转化为前120位的冲突。我希望那些对密码学一无所知的人停止对他们几乎不知道或根本不知道的答案进行否决投票。FFS或者,使用base64-SHA-256的前30个字符,这可能比SHA-1更少。你还可以研究哪个可以在30个字符中容纳192位的熵。如果你陈述了散列函数的要求,这会有所帮助…就像tc所说的。如果您只想让它生成一个基本上是随机的数据“唯一ID”,或者只由受信任的人创建,那么散列不需要具有抗冲突性。如果您在“证明”具有相等哈希的数据是相等的,并且数据可能是恶意生成的冲突的上下文中使用它,那么标准的做法是使用SHA-256或SHA-512,因为MD5完全被破坏(随意生成冲突),而SHA-1并不能很好地证明未来,因为攻击似乎正在稳步接近可行性。