最近,当我尝试使用密码保存记录时,我开始收到BCrypt“无效哈希”错误,因此我查看了BCrypt代码,发现了以下用于验证密码的方法:
def valid_hash?(h)
h =~ /^\$[0-9a-z]{2}\$[0-9]{2}\$[A-Za-z0-9\.\/]{53}$/
end
我对正则表达式不是很了解,所以我不确定该表达式到底在寻找什么,但是我已经测试了许多完全不同长度的完全正常的密码,但都不满足要求。例如:
"PassiveForbearenceFox"
"VindictivePurpleAlligator12345"
"LostBlueLizard!@#$1234"
全部返回零。
这是故意的吗?这是BCrypt之前使用的正则表达式吗?我需要更改吗?
更新:
我深入研究,发现正则表达式正在检查散列密码,但是由于某种原因而被传递的散列后面有无穷的/x00
流。例如,如果我输入密码“ LostBlueLizard!@#1234”,则传递给挑战正则表达式的哈希是
"$2a$11$NcmldbbyCDfumGYALgYhfuIQt2FZ8gpbVCQfuiVlwjhCtkD2ndDFy\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\.....
等等,比我能滚动的还要远。
如果我删除\xoo
并仅传递“ $ 2a $ 11 $ NcmldbbyCDfumGYALgYhfuIQt2FZ8gpbVCQfuiVlwjhCtkD2ndDFy”,它将通过正则表达式。
没有人知道为什么哈希中包含这些字符吗?我无法证明以前没有密码,但是直到最近我的密码始终都被接受。
这并不意味着Bcrypt的valid_hash吗?方法错误,表示存储的密码无效或与有效哈希系统不匹配的nil。
您可能必须添加
has_secure_password
如果没有,请在此之后检查password_digest字段。