2

我使用了消息摘要,我看到它有时与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和不应该?我得出的简短研究结论是,只要涉及密码元素,就会使用盐。

4

3 回答 3

7

消息摘要(也称为“散列”)是摘要或加密散列函数的输出,它是一种单向固定大小输出压缩函数,具有对输入(消息)进行微小更改会导致输出摘要中的大的、不可预测的变化。如何使用这样的功能很大程度上取决于您尝试使用它做什么。

术语“盐”是指散列函数的一个小的随机输入,用于在添加可能以某种方式可预测的附加输入之前改变函数的状态。这是一种安全机制,用于在使用消息摘要作为密码验证功能时保护密码。如果不使用盐,那么任何具有相同密码的用户都将在用户数据库中存储相同的密码哈希。巨大的高效哈希反转表(“彩虹表”) 以这种方式使用的最常见的消息摘要函数(MD5、NTLM 密码哈希等)存在,并且获得数据库的攻击者只需执行表查找即可获得每个用户的明文密码。使用盐可以防止生成这些表,因为盐的每个字节都会导致查找表的大小增加 256 倍。

需要注意的是,简单的带有盐的消息摘要不足以保护密码存储和验证。这是一个复杂的问题,并且已经存在可以适当抵抗攻击的解决方案:PBKDF2bcryptscrypt等。

同样,验证消息的正确传输需要使用更高级的加密结构,称为散列消息验证码 (HMAC)。这是建立在消息摘要功能之上的,但使用加密密钥不仅可以保证受保护消息的完整性,还可以保证消息摘要本身的真实性。

于 2015-03-09T13:09:16.783 回答
2

使用盐来避免使用彩虹表一次对所有密码进行暴力攻击。通过添加盐(并将其与密码一起存储),您可以通过让攻击者计算每个存储密码的哈希值来减慢彩虹表攻击,而不是一次比较所有密码。

于 2015-03-09T12:48:54.700 回答
1

您关于将其与 MessageDigest 一起使用的结论是正确的,除其他外,盐(随机数)用于防止使用彩虹表来破解密码哈希。

彩虹表是用于反转密码散列函数的预计算表,通常用于破解密码散列。表通常用于恢复由一组有限字符组成的特定长度的明文密码。这是空间/时间权衡的一个实际示例,与每次尝试计算哈希的蛮力攻击相比,使用更少的计算机处理时间和更多的存储空间,但比具有一个的简单查找表更多的处理时间和更少的存储空间每个哈希条目。使用使用盐的密钥派生函数使得这种攻击不可行。

维基百科

于 2015-03-09T12:44:14.043 回答