将ColdFusion Java哈希函数移植到Ruby
我试图将java哈希函数移植到Ruby,但最终得到的哈希结果与预期的不同。以下是相关的java函数(coldfusion): 预期哈希:将ColdFusion Java哈希函数移植到Ruby,java,ruby,encryption,coldfusion,sha256,Java,Ruby,Encryption,Coldfusion,Sha256,我试图将java哈希函数移植到Ruby,但最终得到的哈希结果与预期的不同。以下是相关的java函数(coldfusion): 预期哈希:0be431aeebf55fdc30296e1224fb80b0edbebcddaedb65fcbad1315e906dde65 返回的哈希:937E8D5FBB48BD494953CD65B8D35C426B80D2F830C5C308E2CDEC422AE244 返回的散列与我刚从digest::SHA2获得十六进制摘要的情况相同: 1.9.3-p547
0be431aeebf55fdc30296e1224fb80b0edbebcddaedb65fcbad1315e906dde65
返回的哈希:937E8D5FBB48BD494953CD65B8D35C426B80D2F830C5C308E2CDEC422AE244
返回的散列与我刚从digest::SHA2获得十六进制摘要的情况相同:
1.9.3-p547 :335 > Digest::SHA2.hexdigest('test1234')
=> "937e8d5fbb48bd4949536cd65b8d35c426b80d2f830c5c308e2cdec422ae2244"
非常感谢您的帮助。您不应该:
password = self.pass
然后
md.update(password)
?这是:
def admin_password
password = ''
5.times do
md = Digest::SHA2.new
md.update(self.pass)
password = self.enc(md.digest.bytes.to_a)
end
password
end
与您的CFML逻辑不匹配。应该是这样的(我是Ruby新手,如果这不是完美的Ruby,请道歉):
完成此操作后,两个代码块返回相同的值,0be431aebf55fdc30296e1224fb80b0edbebcddaedb65fcbad1315e906dde65
坦率地说,如果您也按照@owlstead的建议做了一些调试,您会立即明白这一点。因此,这里也有一个教训:如果你寻求帮助,请注意所提供的帮助。他们不包括Ruby中的调试器吗?调试不会告诉我为什么散列与java函数返回的不同。没有密码不应该=self.passYeah,但在Java中,每次循环迭代都要更新
pass
,而在Ruby中则没有。通过在循环工作时输出中间值进行调试,肯定会告诉您哪里出了问题,相应地,应该在哪里查找。我不知道您的情况,但是如果我继承了这样的代码,即使是从我自己(我已经在它很久了),我会考虑改写。代码>写输出(十六进制[bitshrn(bitAnd(240,local.item),4)+1])代码>在我看来不够清晰,尤其是位和部分(Java中的常量、最高四位或0b1111\u 0000
)谢谢,我看错了。没有考虑到它在迭代过程中编码self.pass
。非常感谢您在调试方面的经验教训@owlstead,很抱歉当你最初回答时没有进一步阅读。
password = self.pass
md.update(password)
def admin_password
password = ''
5.times do
md = Digest::SHA2.new
md.update(self.pass)
password = self.enc(md.digest.bytes.to_a)
end
password
end
def admin_password
# password = '' # get rid of this
5.times do
md = Digest::SHA2.new
md.update(self.pass)
self.pass = self.enc(md.digest.bytes.to_a) # update the correct variable here
end
self.pass # and return the correct variable here
end