2010-11-17 70 views
5

我想在Ruby中复制Convert.ToBase64String()行为。C#到Ruby sha1 base64编码

这里是我的C#代码:

var sha1 = new SHA1CryptoServiceProvider(); 
var passwordBytes = Encoding.UTF8.GetBytes("password"); 
var passwordHash = sha1.ComputeHash(passwordBytes); 
return Convert.ToBase64String(passwordHash); // returns "W6ph5Mm5Pz8GgiULbPgzG37mj9g=" 

当我尝试在Ruby中同样的事情,我得到了相同的SHA1哈希不同的base64字符串:

require 'digest/sha1' 
require 'base64' 
sha1 = Digest::SHA1.hexdigest('password') 
# sha1 = 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 
base64 = Base64.strict_encode64(sha1) 
# base64 = "NWJhYTYxZTRjOWI5M2YzZjA2ODIyNTBiNmNmODMzMWI3ZWU2OGZkOA==" 

我在调试验证C#passwordBytes字节数组与Ruby示例中的sha1值相匹配。是否有一种特殊的方式需要在Ruby中使用Base64来获取C#代码生成的相同字符串?

回答

6

你的base64编码字符串"5baa61...",不"\x5b\xaa\x61..."

变化hexdigestdigest

sha1 = Digest::SHA1.digest('password') 
base64 = Base64.strict_encode64(sha1) 
2

你的C#和Ruby代码正在做的稍微不同的事情。在你的C#代码中,passwordHash是一个字节[20]。在Ruby代码中,sha1包含一个40个字符的字符串。所以你是Base64编码两种不同的东西。因此有不同的结果。