C# 到 Ruby sha1 base64 编码

发布于 2024-10-03 05:21:25 字数 791 浏览 3 评论 0原文

我正在尝试在 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# 代码生成的相同字符串吗?

I'm trying to replicate the Convert.ToBase64String() behavior in Ruby.

Here is my C# code:

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

When I try the same thing in Ruby, I get a different base64 string for the same sha1 hash:

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

I verified in the debugger that the C# passwordBytes byte array matches the sha1 value in the Ruby example. Is there a special way I need to use Base64 in Ruby to get the same string that the C# code produces?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

上课铃就是安魂曲 2024-10-10 05:21:25

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

更改 hexdigest 摘要

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

You're base64-encoding the string "5baa61...", not "\x5b\xaa\x61..."

Change hexdigest to digest:

sha1 = Digest::SHA1.digest('password')
base64 = Base64.strict_encode64(sha1)
过气美图社 2024-10-10 05:21:25

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

Your C# and Ruby code are doing slightly different things. In your C# code, passwordHash is a byte[20]. In your Ruby code, sha1 contains a 40-character string. So you're Base64 encoding two different things. Hence the different results.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文