C#转换为Ruby的sha1 base64编码

5

我正在尝试在Ruby中复制Convert.ToBase64String()的行为。

以下是我的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#代码生成的相同字符串?

2个回答

7

您正在对字符串"5baa61..."进行base64编码,而不是"\x5b\xaa\x61..."

hexdigest更改为digest

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

2

你的C#和Ruby代码执行的功能略有不同。在C#代码中,passwordHash是一个byte[20]类型的数组。而在Ruby代码中,sha1则包含了一个40个字符的字符串。因此你对两个不同的东西进行了Base64编码,这就导致了不同的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接