gpt4 book ai didi

Java MessageDigest 和 .NET SHA1Managed - 哈希值不匹配

转载 作者:行者123 更新时间:2023-12-01 05:54:10 25 4
gpt4 key购买 nike

我有一些 .net 代码,可以在 xml 文档上生成 SHA1 哈希值,并需要它与 java 代码中在同一 xml 文档上生成的 SHA1 哈希值相匹配。 xml 文档被发送到 java 系统,它们会生成一个哈希值并与我发送的哈希值进行匹配,以验证它们是否正在获取我想要的文档。下面是用于此目的的片段,它们都始终生成相同的不同哈希值。知道为什么以下代码不会生成相同的哈希值吗?

.NET

    String fileName = @"D:\Projects\CHIEP\hasherror\cdadoc.xml";
byte[] buff = null;
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
long numBytes = new FileInfo(fileName).Length;
buff = br.ReadBytes((int)numBytes);

HashAlgorithm hash = new SHA1Managed();
byte[] hashBytes = hash.ComputeHash(buff);
string hex = BitConverter.ToString(hashBytes);
hex = hex.Replace("-", "").ToLower();

Java

public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md;
md = MessageDigest.getInstance("SHA-1");
byte[] sha1hash = new byte[40];
md.update(text.getBytes("UTF-8"), 0, text.length());
sha1hash = md.digest();
//String converted = convertToHex(sha1hash);
String converted = getHexString(sha1hash);
return converted;
}

.NET 输出
587691443778c1da54c3fd04bb35ec68a5a7fecd

Java 输出:
89665a8268d7d1901aba529dc8c9cea0f910c1bd

输入是在此处创建的 UTF-8 编码的 CDA 文档:

    XmlSerializer serializer = new XmlSerializer(obj.GetType());            
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, new UTF8Encoding(false));
XmlDocument xmlDoc = new XmlDocument();
serializer.Serialize(xmlTextWriter, obj);
memoryStream = (System.IO.MemoryStream)xmlTextWriter.BaseStream;
String xml = UTF8Encoding.UTF8.GetString(memoryStream.ToArray());

更新:

接近解决方案。我在文档中发现一个字符在 java 中的解释与 .net 代码中的解释不同。

Java 读取此内容:

value="21.9456" unit="kg/m²"

.net 的内容如下:

value="21.9456" unit="kg/m²"

如果我在我选择的 xml 编辑器中打开,它看起来就像 .net 读入的内容。我怀疑它与 java 进行转换有关,而 .net 只是假设......

最佳答案

我有以下java代码:

MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(password);

我将其转换为 C#,如下所示:

var sha1 = SHA1Managed.Create();
byte[] outputBytes = sha1.ComputeHash(password);

为了使我的哈希值匹配,我包含您在示例中的以下代码:

string hex = BitConverter.ToString(hashBytes);
hex = hex.Replace("-", "").ToLower();

关于Java MessageDigest 和 .NET SHA1Managed - 哈希值不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3640013/

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