【发布时间】:2014-08-12 15:37:22
【问题描述】:
我正在尝试将 java 散列函数移植到 Ruby,但最终得到的散列值与预期不同。下面是相关的java函数(coldfusion):
public string function hashAdministrator(required string pass) {
MessageDigest = createObject('java','java.security.MessageDigest');
for(i=1; i<=5; i++) {
md = MessageDigest.getInstance('SHA-256');
md.update(pass.getBytes('UTF-8'));
pass = enc(md.digest());
}
return pass;
}
private string function enc(strArr) {
//local.strArr = str.getBytes('UTF-8');
local.hex = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
savecontent variable="local.out" {
for (local.item in strArr) {
writeOutput(hex[bitshrn(bitAnd(240,local.item),4)+1]);
writeOutput(hex[bitAnd(15,local.item)+1]);
}
};
return local.out;
}
下面是我的红宝石代码:
# encoding: utf-8
require 'digest/sha2'
class RailoPassword
attr_accessor :pass
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 enc(strarr)
hex = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
a = ''
strarr.each do |item|
a << hex[((0xF0 & item) >> 4)]
a << hex[(0x0F & item)]
end
a
end
end
ruby 中的实际实现:
a = RailoPassword.new
a.pass = 'test1234'
puts 'expected: 0be431aeebf55fdc30296e1224fb80b0edbebcddaedb65fcbad1315e906dde65'
puts "actual: #{a.admin_password}"
预期哈希:0be431aeebf55fdc30296e1224fb80b0edbebcddaedb65fcbad1315e906dde65
返回的哈希:937e8d5fbb48bd4949536cd65b8d35c426b80d2f830c5c308e2cdec422ae2244
返回的哈希与我刚刚从 Digest::SHA2: 获得十六进制摘要相同:
1.9.3-p547 :335 > Digest::SHA2.hexdigest('test1234')
=> "937e8d5fbb48bd4949536cd65b8d35c426b80d2f830c5c308e2cdec422ae2244"
任何帮助将不胜感激。
【问题讨论】:
-
我不了解你,但如果我要继承这样的代码,甚至是我自己(我已经做了很长时间了)我会考虑重写。我认为
writeOutput(hex[bitshrn(bitAnd(240,local.item),4)+1]);不够清晰,尤其是bitAnd部分(Java 中的常量HIGHEST_FOUR_BITS或0b1111_0000怎么样?)
标签: java ruby encryption coldfusion sha256