2017-10-17 66 views
0

我有一个奇怪的问题,从C#代码翻译成Java获取等价的哈希码。我不知道,MessageDigest更新方法是做什么的。它应该只更新摘要的内容,并应在调用摘要后计算散列值。将Java代码散列到C#中的等效功能是什么?

我正在用C#与SHAManaged512.ComputeHash(内容)做同样的事情。但我没有得到相同的哈希码。

以下是Java代码。

public static String hash(String body, String secret) { 
    try { 
     MessageDigest md = MessageDigest.getInstance("SHA-512"); 
     md.update(body.getBytes("UTF-8")); 

     byte[] bytes = md.digest(secret.getBytes("UTF-8")); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < bytes.length; i++) { 
      sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)); 
     } 

     return sb.toString(); 
    } catch (Exception e) { 
     throw new RuntimeException(); 
    } 
} 

以下是C#代码

private byte[] ComputeContentHash(string contentBody) 
{    
     using (var shaM = new SHA512Managed())  
     { 
      var content = string.Concat(contentBody, Options.SecretKey); 

      var hashedValue = shaM.ComputeHash(ToJsonStream(content)); 
      return hashedValue; 
     } 
} 

public static Stream ToJsonStream(object obj) 
{ 
    return new MemoryStream(Encoding.Unicode.GetBytes(obj.ToString())); 
} 

回答

-1

Encoding.Unicode(你正在使用的C#ToJsonStream方法)不是UTF8。它是UTF16。见MSDN。 (请记住,UTF16可以是小端或大端。)您正在寻找Encoding.UTF8

首先要做的是检查你的哈希字节数组是否相同。

+0

感谢您的意见。 我是自己做的。问题是先追加C#端的Secret Key,然后追加Content。 – Usman

+0

@Usman在这种情况下,你可以接受你自己的答案。至于我的回答,它依然成立。我不知道它是如何工作的,因为UTF8通常与UTF16不同,并且您明显在C#中使用UTF8和Java和UTF16。 – ispiro

+0

@downvoter谨慎解释为什么? – ispiro

0

解决方法是放入第一个密钥并将其与有效负载数据连接起来。

相关问题