Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将ColdFusion Java哈希函数移植到Ruby_Java_Ruby_Encryption_Coldfusion_Sha256 - Fatal编程技术网

将ColdFusion Java哈希函数移植到Ruby

将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

我试图将java哈希函数移植到Ruby,但最终得到的哈希结果与预期的不同。以下是相关的java函数(coldfusion):

预期哈希:
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