为什么SHA1散列相同的字符串不同?

时间:2013-05-13 08:47:42

标签: ruby-on-rails ruby ruby-on-rails-3 sha1

这是我必须在注册时对用户密码进行加密和哈希处理的代码(实际密码哈希因为一致地进行散列而被取出)。发生的事情是,当我使用第一个代码块时,如果我尝试在用户注册后对数据库中找到的哈希值进行哈希处理,那么哈希值会与存储在password_digest中的哈希值不同。但是,如果我使用第二个或第三个代码块,它们会散列到同一个东西,这就是我想要的行为。

salt = rand
write_attribute :password_digest, Digest::SHA1.hexdigest("#{salt}")
write_attribute :salt, salt

VS

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}"

saltpassword_digest都属于:string类型。

[结束编辑]

这是为什么?在我看来,他们应该有完全相同的行为。如果我将"#{salt}"直接存储在password_digest中而不对其进行散列,则它与salt属性完全匹配,因此无论何时发生散列,它们都应该散列到相同的位置。此外,如果我在数据库中手动创建一个涉及调用此相同函数来设置密码的用户,则无论我使用哪个代码块,哈希都会正确匹配,因此当我通过创建用户时,哈希冲突似乎只会发生浏览器表单。

[编辑]第三个代码块似乎表明在没有显式强制的情况下调用salt上的write_attribute(这是正确的术语吗?),当它存储在数据库中时,它会以某种方式更改salt的值。虽然这对我来说似乎不太可能。

[编辑]举例说明第一个代码行为: 在数据库中,

password_digest = "2f4d39ae81f480f6ad8a759eec6b8b386fbdf636"

salt = 0.17127103546001

然而,Digest::SHA1.hexdigest("0.17127103546001") = "c46566206c072dd453220dac835de6204e64c044"

0 个答案:

没有答案