Scrypt参数选择不当导致密码验证失败怎么办?
我在用scrypt加密用户密码时,调整了salt长度和N参数,结果密码验证一直报错。之前用默认参数没问题,但参考文档把N设成16384后,存储的hash和验证时算出来的值完全不一样。
尝试过把r和p参数改小一点,但还是失败。控制台提示”Invalid key derived”错误,是不是参数组合有问题?
// 加密时参数
const scryptParams = {
N: 16384,
r: 8,
p: 1,
dkLen: 64
};
// 验证时参数(可能被其他地方覆盖了?)
const verifyParams = {
N: 8192,
r: 8,
p: 1,
dkLen: 64
};
N必须完全一样,现在一个是 16384,另一个是 8192,当然会报错。确保两边用同样的scryptParams就行:另外,建议把参数配置抽到一个公共文件里,避免这种低级错误。
N值都不一样,加密用的是16384,验证却用8192,这就完犊子了。Scrypt对参数特别敏感,尤其是N值,必须保证加密和验证时完全一致。解决办法很简单,你得确保存储密码hash的时候,把用的参数也存下来。比如主题里加个字段,存成JSON:
验证的时候,先从数据库里把对应的
params取出来,用相同的参数再跑一遍就行。千万别硬编码参数,不然以后改了又得跪。另外提醒一句,
N值设16384已经挺大了,如果你服务器性能一般,可能会有点慢,根据自己实际情况调整吧。