【问题标题】:Java MessageDigest and .NET SHA1Managed - hashes not matchingJava MessageDigest 和 .NET SHA1Managed - 哈希不匹配
【发布时间】:2010-09-03 22:32:12
【问题描述】:

我有一些 .net 代码在 xml 文档上生成 SHA1 哈希,并且需要它来匹配在 java 代码中相同 xml 文档上生成的 SHA1 哈希。 xml 文档被发送到 java 系统,它们生成一个哈希值并与我发送的那个进行匹配,以验证他们正在获取我想要的文档。以下是为此使用的 sn-ps,它们都始终生成相同的不同哈希值。任何想法为什么以下代码不会生成相同的哈希?

.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 只是假设..

【问题讨论】:

  • 你能分享.NET和Java版本产生的字符串吗?另外,我看到您的 Java 版本将字符串转换为 UTF-8 以获得字节序列,但您的 .NET 版本只是假设文件中的内容与转换为 UTF-8 的内存中字符串具有相同的字节序列表示。文件的编码是什么?
  • 获取您生成的输出 XML 字符串并运行 diff。我敢打赌输出是不同的
  • @seh 我认为你是对的......调查一下......

标签: java .net hash sha1


【解决方案1】:

我有以下 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2013-08-20
    • 2014-05-19
    • 2020-12-08
    • 1970-01-01
    相关资源
    最近更新 更多