【问题标题】:How to get same result with Dart sha256 and C# sha256?如何使用 Dart sha256 和 C# sha256 获得相同的结果?
【发布时间】:2019-04-22 18:09:09
【问题描述】:

我必须在 dart 中将字符串转换为 sha256。例如,我使用 String a = "2424242401224672"; 在下面的代码中,我得到的结果是;摘要:7b73641404a8fe6a4b1161a85db736be2a6c07a046109b993186f7a22190bf13

守则:

  String a = "2424242401224672";
  var bytes = utf8.encode(a.hashCode.toString());
  var digest = sha256.convert(bytes);
  print("digest: $digest");

在另一方使用 c# for sha256。他们使用 c# MemoryStream、BinaryFormatter 和 XMLSerilizer 从字符串(对象)中获取字节。

但是当我展示我的结果时,他们告诉我他们在 C# sha256 中得到了不同的结果?

如何使用 Dart sha256 和 C# sha256 获得相同的结果?

更新:

CSharp 中的字符串“2424242401224672”的 sha256 值为: DE4841A9E623AF7D5C598A67C2461702485F6B77C3EB5448FA5E0DDF074C70D8

更新 2:

csharp 代码:

private static string ComputeHash(byte[] objectAsBytes)
{                        
    try
    {
        SHA256 shaM = new SHA256Managed();
        byte[] result = shaM.ComputeHash(objectAsBytes);

        return byteArrayToHex(result);
    }
    catch (ArgumentNullException ane)
    {
        return null;
    }
}



private static byte[] ObjectToByteArray(Object objectToSerialize)
{            
    MemoryStream ms = new MemoryStream();
    //BinaryFormatter formatter = new BinaryFormatter();            
    System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(objectToSerialize.GetType());
    try
    {
        //Here's the core functionality! One Line!
        //To be thread-safe we lock the object
        lock (locker)
        {
            x.Serialize(ms, objectToSerialize);
            //formatter.Serialize(fs, objectToSerialize);
        }
        //return fs.ToArray();                
        return ms.ToArray();
    }
    catch (SerializationException se)
    {                
        return null;
    }
    finally
    {
        //fs.Close();
        ms.Close();
    }
}

}

【问题讨论】:

  • 我不知道 C# 版本正在做什么来生成该哈希。这似乎不正确。你有 C# 代码吗?
  • 您还应该显示 c# 代码。可能是由不同的编码(utf8 vs utf16)引起的
  • 我用 c# 尝试了一些常见的编码。它们都不会产生您的哈希码。所以你在c#端做错了(可能和scala端的错误一样)
  • 我会尝试获取并更新 csharp 代码
  • 我更新了我的问题并添加了 csharp 代码。

标签: c# dart sha256


【解决方案1】:

您没有对字符串的 UTF-8 表示进行哈希处理。您对字符串 hashcode 的 UTF-8 表示进行了散列处理。那就是:

  var bytes = utf8.encode(a.hashCode.toString());

应该只是:

  var bytes = utf8.encode(a);

【讨论】:

  • jamesdin 我仍然在 csharp 上得到不同的结果
  • @Nick:如果您发布了您获得的摘要以及您期望的摘要,将会有很大帮助。可能 C# 版本做错了/不同。例如,它可能包含一个 NUL 终止符。进行我在回答中描述的更改会生成与 emn178.github.io/online-tools/sha256.html 相同的摘要。
  • 我更新了我的问题并添加了 csharp 代码。我没有 csharp 知识,所以请耐心等待。对方使用 csharp 代码,他们发现了不同的结果。我没有 csharp 开发环境,所以我无法测试它是否真实。
  • @Nick 有许多在线 SHA-256 可供您比较。如果您使用的是 Linux,那么您也可以使用sha256sum 命令行程序进行比较。 (请注意,使用 sha256sum 程序时,您需要小心提供不包含换行符的输入。或者在 Dart 字符串中添加换行符以与之进行比较。)所有这些都应该足以证明Dart 程序正在生成正确的哈希值。
猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 2014-01-26
  • 2020-02-06
  • 2014-07-21
  • 2017-01-04
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
相关资源
最近更新 更多