首页 > 解决方案 > 如何使用 Dart sha256 和 C# sha256 获得相同的结果?

问题描述

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

编码:

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

在另一方使用 c# 为 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#dartsha256

解决方案


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

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

应该只是:

  var bytes = utf8.encode(a);

推荐阅读