Spring中Scrypt PasswordEncoder如何从哈希中获取原始盐值验证密码?
SCrypt哈希值中的盐值位置解析
你给出的SCrypt哈希字符串采用**$分隔的结构化格式**,直接包含了验证所需的所有信息,盐值的位置可以通过拆分字符串明确找到:
以你提供的hash1为例:
$100801$DBrs3RHYQafAjmY0RGGgtA==$VB1ahwEHntb36HWbAF1Eiy6FoJp1WH8xmpYY4+oHPUk=
按$拆分后,会得到三个有效内容段(忽略开头空片段):
- 第一段
100801:编码后的SCrypt参数,包含成本因子、块大小等运算配置 - 第二段
DBrs3RHYQafAjmY0RGGgtA==:Base64编码的原始盐值,这就是验证密码时需要提取的盐 - 第三段
VB1ahwEHntb36HWbAF1Eiy6FoJp1WH8xmpYY4+oHPUk=:Base64编码的最终哈希结果
同理,hash2中的盐值是第二段的0EEqkaQUDzVCttua+jqu9A==——正是因为每次哈希生成的盐值随机唯一,才导致两次哈希结果不同,这是SCrypt的安全设计。
验证时,SCrypt工具会自动按$分割哈希字符串,提取中间的盐值和第一段的参数,用同样的配置对输入密码重新哈希,再和第三段的结果比对,以此完成密码验证。
内容的提问来源于stack exchange,提问作者usertest
相关产品推荐
相关产品推荐

