何时在Message Digest中使用盐

Jav*_*per 2 java message-digest

我正在使用消息摘要,我看到它有时与 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.   
        }
Run Code Online (Sandbox Code Playgroud)

有时不加盐:

 md.update(data);
 byte[] toChapter1Digest = md.digest();
Run Code Online (Sandbox Code Playgroud)

现在,我应该何时使用摘要,salt而不应该使用?我得出的简要研究结论是,每当涉及密码元素时,都会使用盐。

bon*_*ing 5

消息摘要(也称为“哈希”)是摘要或加密哈希函数的输出,该函数是一种单向固定大小输出压缩函数,其特性是输入(消息)的微小变化导致输出摘要中的巨大,不可预测的变化。如何使用这种功能很大程度上取决于您要使用的功能。

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

非常重要的一点是要注意,简单的盐信息摘要不足以保护密码存储和验证。这是一个复杂的问题,已经存在可以正确抵抗攻击的解决方案:PBKDF2bcryptscrypt和其他。

同样,验证消息的正确传输需要使用一种称为“哈希消息验证码”(HMAC)的更高级的密码结构。这是基于消息摘要功能构建的,但是使用加密密钥不仅可以保证受保护消息的完整性,而且可以保证消息摘要本身的真实性。