在 Spring 中使用
SCrypt两次对“
MYpassword
”进行哈希处理会生成两个不同的哈希值,这是预期的结果,因为盐不同。
hash 1: $100801$DBrs3RHYQafAjmY0RGGgtA==$VB1ahwEHntb36HWbAF1Eiy6FoJp1WH8xmpYY4+oHPUk=
hash 2: $100801$0EEqkaQUDzVCttua+jqu9A==$tstqjgsW5bzWXwRZKIeVy9P3jh/92QrZ8SW+8iLl7dc=
我不明白的是,为了验证密码,Scrypt 需要用于哈希的原始盐。经过搜索,我发现它从哈希字段本身获取盐。那么上面例子中的具体位置在哪里呢?我搜索了 scrypt 格式解码,但没有找到任何结果。
根据源代码,
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。