gpt4 book ai didi

c# - 将 C# SHA256 哈希转换为 Ruby

转载 作者:数据小太阳 更新时间:2023-10-29 07:55:27 26 4
gpt4 key购买 nike

我有 C# 代码:

byte[] bytes = new UnicodeEncoding().GetBytes(input);
return Convert.ToBase64String(new SHA256Managed().ComputeHash(bytes));

将字符串编码为 SHA2 散列,然后进行 base 64 编码。我需要将其转换为 Ruby。

我尝试了几种方法。这是其中之一:

hash = Digest::SHA256.digest(val.encode('utf-8'))
encoded = Base64.urlsafe_encode64(hash)

我的代码都产生了不匹配的相同结果。我无法让他们工作。任何有关转换此内容的帮助将不胜感激。

更新

经过一番折腾后,我能够让它与硬编码数组一起工作,问题是 C# 代码在数组中的每个元素之后添加了一个 0。这是工作的 ruby​​ 代码(带有硬编码数组):

Digest::SHA256.base64digest([99,0,104,0,97,0,100,0].pack('C*').force_encoding('utf-16'))

我想我可以遍历数组,但这似乎没有必要。

最佳答案

解决方案:

你需要使用UTF-16LE编码来得到相同的SHA-256 Hash

p hash = Digest::SHA256.base64digest("Hello".encode('UTF-16LE'))

我是怎么找到的?

我用了Online C# Tool使用以下代码创建字符串 "Hello" 的散列:

using System.IO;
using System;
using System.Text;
using System.Security.Cryptography;

class Program
{
static void Main()
{
byte[] bytes = new UnicodeEncoding().GetBytes("Hello");
String s = Convert.ToBase64String(new SHA256Managed().ComputeHash(bytes));
Console.WriteLine(s);
}
}

以上程序产生了输出 oH5Pc0MkbIKybzLlb4VBjVGNiy8trnfx1W/nr1Dbl68=

然后,我编写了一个 Ruby 程序来计算字符串 "Hello" 的 Base64 编码 SHA-256 哈希值,方法是将字符串编码为 Ruby 支持的所有字符编码,以确定使用哪种字符编码将给出完全相同的结果。

require "digest/sha2"
require "base64"
s = "Hello"
Encoding.list.each { |e| puts "Encoding: #{e.to_s} => Hash: #{Digest::SHA256.base64digest(s.encode(e)) rescue "error"}"}

运行程序后,我得出结论,如果您使用 UTF-16LE 编码,您将获得完全相同的输出。

p hash = Digest::SHA256.base64digest("Hello".encode('UTF-16LE'))

根据 documentation of UnicodeEncoding ,它:

Represents a UTF-16 encoding of Unicode characters.

关于c# - 将 C# SHA256 哈希转换为 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32162853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com