Digest :: SHA2.hexdigest从相同的参数生成两个完全不同的值

这是我见过的最奇怪的事情之一。 我正在维护的一些遗留代码会生成摘要:

require 'digest/sha1' def encrypt(password, salt) Digest::SHA2.hexdigest("--#{salt}--#{password}--") end 

我用“hello”和“world”作为参数调用该方法,我得到了这个:

 15ea8ac62708f3810b720b25dd6febe9d0ddc1ed 

但如果我直接这样做:

 Digest::SHA2.hexdigest("--world--hello--") 

我明白了:

 c95b3d8968d8044c42ff650ade81315ab9adf120e2b62a637e64fa362cb828dd 

请原谅我的法语,但WTF?!

我应该寻找Digest::SHA2某种设置吗? 什么可能引发差异?

我认为你的第一个代码实际上是:

 def encrypt(password, salt) Digest::SHA1.hexdigest("--#{salt}--#{password}--") end 

…因为:

 irb> Digest::SHA1.hexdigest '--world--hello--' #=> "15ea8ac62708f3810b720b25dd6febe9d0ddc1ed" irb> Digest::SHA2.hexdigest '--world--hello--' #=> "c95b3d8968d8044c42ff650ade81315ab9adf120e2b62a637e64fa362cb828dd" 

因此,您在问题中提供的代码可能不是实际存在于您的应用程序中的代码,或者其他人正在以相同的方式重新定义encrypt ,但是使用SHA1,或者您已经在代码中进行了更改,但仍在使用旧/缓存代码没有意识到它。