c# - 如何使用 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();
}
}
}
解决方案
您没有散列字符串的 UTF-8 表示。您对字符串hashcode的 UTF-8 表示进行了哈希处理。那是:
var bytes = utf8.encode(a.hashCode.toString());
应该只是:
var bytes = utf8.encode(a);
推荐阅读
- c++ - 无法在 VSC 中使用 Qt 构建项目
- docker - Docker 应用程序如何从 Docker 外部的网络共享路径获取文件列表?
- html - 在引导程序中创建多项选择题并允许 2 个或更多选择
- node.js - 我如何在节点 js sequelize 中编写此查询
- java - Jackson 和 Lombok:当属性是对象时出现 MismatchedInputException
- java - 在 JOOQ 中分页之前获取总行数?
- ios - 在 iOS 中使用 firebase 时动态链接无效
- java - 没有自动装配的 Spring 服务定位器
- .htaccess - 如何将 URL 从查询参数重写为路径段
- jsonata - JSONata 递归映射