开发者手册:Scrypt 验证核心逻辑

Scrypt 验证的本质是“确定性重计算”。由于哈希过程是不可逆的单向函数,验证程序必须在完全相同的环境变量下模拟生成过程。

验证成功的三个必要条件

  • 参数一致性:N (Cost)、r (Block Size)、p (Parallelization) 必须与生成时完全一致。哪怕 N 从 16384 变为 16385(虽然 N 必须是 2 的幂),结果也会天差地别。
  • 盐值 (Salt) 还原:如果生成时使用的是 Hex 或 Base64 格式存储的盐值,验证时必须先将其还原为原始字节。
  • 派生长度 (dkLen):生成的 Hex 字符串长度必须与存储值长度对等(例如 32 字节对应 64 位 Hex 字符)。

为什么验证会失败?

1. 编码陷阱:明文密码中如果包含特殊字符(如中文字符),UTF-8 编码的不统一会导致计算出的字节流不同。

2. 自动截断:某些旧版数据库可能会截断过长的 Hex 字符串,导致比对时长度不匹配。

3. 盐值处理:在传输过程中,盐值是否被多进行了一次 URL 编码或转义?