这是我在用户注册时必须对用户密码进行加盐和散列的代码(实际密码散列被取出,因为它一直在散列)。发生的情况是,当我使用第一个代码块时,如果我尝试在用户注册后对在数据库中找到的 salt 进行哈希处理,它会哈希到与 password_digest 中存储的内容不同的内容。但是,如果我使用第二个或第三个代码块,它们会散列到相同的东西,这就是我想要的行为。
salt = rand
write_attribute :password_digest, Digest::SHA1.hexdigest("#{salt}")
write_attribute :salt, salt
对比
salt = "#{rand}"
write_attribute :password_digest, Digest::SHA1.hexdigest(salt)
write_attribute :salt, salt
[编辑]
或者
salt = rand
write_attribute :password_digest, Digest::SHA1.hexdigest("#{salt}")
write_attribute :salt, "{#salt}"
salt
和都是password_digest
类型:string
。
[结束编辑]
为什么是这样?在我看来,他们应该有完全相同的行为。如果我"#{salt}"
直接存储在 password_digest 中而不对其进行散列,则它与salt
属性完全匹配,因此无论何时发生散列,它们似乎都应该散列到同一事物。此外,如果我在数据库中手动创建一个涉及调用相同函数来设置密码的用户,那么无论我使用哪个代码块,哈希都会正确匹配,因此哈希冲突似乎只发生在我通过创建用户时浏览器表单。
[编辑]第三个代码块似乎表明在盐上调用 write_attribute 而不显式强制(这是正确的术语吗?)当盐存储在数据库中时,它会以某种方式改变盐的值......虽然这个对我来说似乎不太可能。
[编辑] 举一个第一块代码行为的例子:在数据库中,
password_digest = "2f4d39ae81f480f6ad8a759eec6b8b386fbdf636"
和
salt = 0.17127103546001
.
然而,Digest::SHA1.hexdigest("0.17127103546001") = "c46566206c072dd453220dac835de6204e64c044"
.