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