首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C# SHA256哈希转换为SHA256

将C# SHA256哈希转换为SHA256
EN

Stack Overflow用户
提问于 2015-08-23 03:22:02
回答 3查看 1.1K关注 0票数 4

我有C#代码:

代码语言:javascript
复制
byte[] bytes = new UnicodeEncoding().GetBytes(input);
return Convert.ToBase64String(new SHA256Managed().ComputeHash(bytes));

它将字符串编码为SHA2哈希,该哈希随后被基64编码。我需要把这个转换成Ruby。

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

代码语言:javascript
复制
hash = Digest::SHA256.digest(val.encode('utf-8'))
encoded = Base64.urlsafe_encode64(hash)

我的代码都会产生不匹配的结果。我不能让他们去工作。如能对此进行转换,将不胜感激。

更新

经过一些混乱之后,我能够让它处理一个硬编码数组,问题是C#代码在数组中的每个元素之后都添加了一个0。下面是工作的ruby代码(带有硬编码的数组):

代码语言:javascript
复制
Digest::SHA256.base64digest([99,0,104,0,97,0,100,0].pack('C*').force_encoding('utf-16'))

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-23 10:13:57

解决方案:

您需要使用UTF-16LE编码才能获得相同的sma-256散列。

代码语言:javascript
复制
p hash = Digest::SHA256.base64digest("Hello".encode('UTF-16LE'))

我怎么找到的?

我使用在线C#工具创建字符串"Hello"的散列,使用以下代码:

代码语言:javascript
复制
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来计算same 64编码的字符串"Hello"的SHA-256散列,方法是在所有支持的Ruby字符编码中对字符串进行编码,以确定哪个字符编码将提供完全相同的结果。

代码语言:javascript
复制
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编码,您将得到完全相同的输出。

代码语言:javascript
复制
p hash = Digest::SHA256.base64digest("Hello".encode('UTF-16LE'))

根据UnicodeEncoding,它:

表示Unicode字符的UTF-16编码。

票数 5
EN

Stack Overflow用户

发布于 2015-08-23 04:28:47

我认为您应该将new UnicodeEncoding()更改为new UTF8Encoding(),或者只使用Encoding.UTF8

Unicode是C#中的UTF-16。

票数 1
EN

Stack Overflow用户

发布于 2015-08-23 06:19:21

所以这是一堆物品。在C#中,UnicodeEncoding().GetBytes(str)显然在字节数组中在每个字符之后添加了一个0。所以我不得不在Ruby里解决这个问题。幸运的是,我能够用一点红宝石魔法来做到这一点。完整的工作解决方案如下。

代码语言:javascript
复制
byte_array = input.bytes.zip(input.bytes.map{|b| 0}).flatten.compact
Digest::SHA256.base64digest(byte_array.pack('C*').force_encoding('utf-16'))

这给了我一个与数据库中的值匹配的相同的散列输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32162853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档