是否有一个函数可以生成一个具有我想要的精确长度的哈希?我知道 MD5 总是有16个字节。但我想定义生成的哈希的长度。
示例:
hash('Something', 2) = 'gn'
hash('Something', 5) = 'a5d92'
hash('Something', 20) = 'RYNSl7cMObkPuXCK1GhF'
当长度增加时,结果应该比重复更安全。
答案 0 :(得分:6)
即将推出的 SHAKE256 (或安全级别为128位而不是256位的SHAKE128),即所谓的可扩展输出功能(XOF),正如您所说的那样寻找。它将与SHA3一起定义。已有draft online。
如果您现在需要已建立的解决方案,请遵循CodesInChaos建议并在最大64字节足够时截断SHA512,否则使用原始数据的散列输出生成流密码。
技术免责声明:在512bit的输出长度之后,“防止重复的安全性”(抗冲击性)不再随着输出的增加而增加,与SHAKE256一样,它已达到原始支持的冲突(256bit)的最大安全级别。 (请注意,由于生日悖论,理想散列函数的安全级别,输出长度为n位,对冲突只有n / 2位。)任何更高的安全级别无论如何都是毫无意义的(可能256位已经是一种过度杀伤)我们的太阳系不能提供足够的能量甚至从0到2 ^ 256。
请不要将“安全级别”与密钥长度混淆:使用对称算法,人们通常期望安全级别等于密钥大小,但使用非对称算法时,这些数字完全不相关:512位RSA加密方案的安全性要低得多比128比特的AES(即512比特的RSA模数已经可以用蛮力来计算)。
如果加密原语试图达到“n比特的安全级别”,则意味着对它的攻击不应超过2 ^ n次操作。
答案 1 :(得分:1)
BLAKE2可以生成1到64个字节之间的任何大小的摘要。
如果您希望将摘要视为加密安全,请考虑Birthday problem以及其他算法使用的内容 - 例如SHA-1使用20个字节,被认为是不安全的,SHA-2使用28/32/48/64个字节,通常被认为是安全的。
如果您只是想避免意外碰撞,仍然要考虑生日问题(上图),但根据应用程序可能会认为16或甚至8个字节已足够(请参阅table)。