我使用了消息摘要,我看到有时会使用salt
synchronized (hasher) {
hasher.update(salt); // "Updates" the digest using the specified byte.
salt++;
digest = hasher.digest(data); // Final "updates" on the digest using the specified array of bytes, then "completes" the digest computation.
}
有时没有盐:
md.update(data);
byte[] toChapter1Digest = md.digest();
现在,我应该什么时候可以使用salt
的摘要而不是我?
简而言之,我总结说,只要涉及密码元素,就会使用盐。
答案 0 :(得分:4)
消息摘要(也称为"散列")是摘要或cryptographic hash function的输出,它是一种单向固定大小输出压缩函数,具有以下属性:输入(消息)的微小变化会导致输出摘要发生大的,不可预测的变化。如何使用这样的功能在很大程度上取决于你试图用它做什么。
术语"salt"是指散列函数的一个小的随机输入,用于在添加可能以某种方式预测的附加输入之前改变函数的状态。这是一种安全机制,用于在使用消息摘要作为密码验证程序功能时保护密码。如果未使用salt,则具有相同密码的任何用户将具有存储在用户数据库中的相同密码哈希。对于以这种方式使用的最常见的消息摘要函数(MD5,NTLM密码哈希等)存在极大的高效哈希反转表("rainbow tables"),并且获取数据库的攻击者只需执行表查找获取每个用户的明文密码。使用salt可以防止生成这些表,因为salt的每个字节都会生成256x size increase of the lookup table.
非常重要的是要注意,使用salt的简单消息摘要对密码存储和验证的保护不足。这是一个复杂的问题,已经存在可以正确抵抗攻击的解决方案:PBKDF2,bcrypt,scrypt和其他。
类似地,验证消息的正确传输需要使用称为哈希消息认证码(HMAC)的更高级的加密结构。这是基于消息摘要功能构建的,但使用加密密钥不仅保证受保护消息的完整性,还保证消息摘要本身的真实性。
答案 1 :(得分:1)
关于它与MessageDigest一起使用的结论是正确的,salt(nonce)等用于防止使用彩虹表来破解密码哈希。
彩虹表是用于反转加密散列函数的预先计算表,通常用于破解密码哈希值。表通常用于恢复明文密码,直到由一组有限的字符组成的特定长度。这是一个空间/时间权衡的实际例子,使用较少的计算机处理时间和更多的存储而不是蛮力攻击,它计算每次尝试的哈希值,但比简单的查找表有更多的处理时间和更少的存储空间每个哈希条目。使用使用盐的密钥派生函数会使这种攻击变得不可行。
请参阅wikipedia
答案 2 :(得分:1)
使用salt来避免使用彩虹表一次性对所有密码进行暴力攻击。通过添加salt(并将其与密码一起存储),您可以通过让攻击者计算每个存储密码的哈希值来减慢彩虹表攻击,而不是一次比较所有密码。