根据文档,scrypt 哈希函数的工作方式如下:
哈希函数执行以下操作:
- 添加随机盐。
- 创建 HMAC 以防止主动攻击。
- 使用 scrypt 密钥派生函数来派生密钥的散列。
哈希格式
所有哈希都以“scrypt”这个词开头。接下来是密钥派生函数中使用的 scrypt 参数,然后是随机盐。最后,附加先前内容的 256 位 HMAC,HMAC 的密钥由 scrypt 密钥派生函数生成。结果是一个 768 位(96 字节)的输出:
- 字节 0-5:单词“scrypt”
- 字节 6-15:Scrypt 参数 N、r 和 p
- 字节 16-47:32 位随机盐
- 字节 48-63:16 位校验和
- 字节 64-95:字节 0 到 63 的 32 位 HMAC,使用由 scrypt 密钥派生函数生成的密钥。
字节 0 到 63 以明文形式保留。这是必要的,因为这些字节包含验证哈希所需的元数据。这些信息没有被加密并不意味着安全性被削弱。就安全性而言,最重要的是散列完整性(意味着散列输出的任何部分都不能更改)并且无法从散列输出中确定原始密码(这就是您使用 scrypt 的原因 - 因为它在好办法)。字节 64 到 95 是所有这些发生的地方。
我的问题是为什么它使用 scrypt 哈希作为 HMAC 算法的密钥,而不是直接返回 scrypt 哈希?这提供了什么额外的保护?它提到了“主动攻击”,但没有提供细节。