Spring Scrypt PasswordEncoder 如何知道原始盐以便能够验证密码

问题描述 投票:0回答:1

在 Spring 中使用

SCrypt
两次对“MYpassword”进行哈希处理会生成两个不同的哈希值,这是预期的结果,因为盐不同。

hash 1: $100801$DBrs3RHYQafAjmY0RGGgtA==$VB1ahwEHntb36HWbAF1Eiy6FoJp1WH8xmpYY4+oHPUk=
hash 2: $100801$0EEqkaQUDzVCttua+jqu9A==$tstqjgsW5bzWXwRZKIeVy9P3jh/92QrZ8SW+8iLl7dc=

我不明白的是,为了验证密码,Scrypt 需要用于哈希的原始盐。经过搜索,我发现它从哈希字段本身获取盐。那么上面例子中的具体位置在哪里呢?我搜索了 scrypt 格式解码,但没有找到任何结果。

spring-security hash scrypt
1个回答
1
投票

根据源代码

private String digest(CharSequence rawPassword, byte[] salt) {
    byte[] derived = SCrypt.generate(Utf8.encode(rawPassword), salt, this.cpuCost, this.memoryCost,
            this.parallelization, this.keyLength);
    String params = Long.toString(
            ((int) (Math.log(this.cpuCost) / Math.log(2)) << 16L) | this.memoryCost << 8 | this.parallelization,
            16);
    StringBuilder sb = new StringBuilder((salt.length + derived.length) * 2);
    sb.append("$").append(params).append('$');
    sb.append(encodePart(salt)).append('$');
    sb.append(encodePart(derived));
    return sb.toString();
}

参数、salt 和 hash 使用

$
分隔符相互附加,因此中间的值是编码后的 salt。

© www.soinside.com 2019 - 2024. All rights reserved.