2017-10-17 24 views
0

Java로 변환 된 C# 코드에서 해시 코드를 가져 오는 데 이상한 문제가 있습니다. 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(); 
    } 
} 

은 UTF8하지 않습니다 (당신이 C# ToJsonStream 방법에서 사용하는) 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입니다. 그것은 UTF16입니다. MSDN을 참조하십시오. (또한 UTF16은 크거나 작은 엔디안 일 수 있습니다.) Encoding.UTF8을 찾고 있습니다.

먼저 해싱 할 바이트 배열이 동일한 지 확인하십시오.

+0

의견을 보내 주셔서 감사합니다. 나는 그것을 혼자서했다. 문제는 C# 측 비밀 키를 먼저 추가 한 다음 내용을 추가하는 것이 었습니다. – Usman

+0

@Usman이 경우 자신의 대답을 수락 할 수 있습니다. 내 대답은 아직 남아 있습니다. UTF8이 일반적으로 UTF16과 다르다는 것과 UTF8을 C 및 Java에서 UTF8로 사용하고 있기 때문에 어떻게 작동하는지 모르겠습니다. – ispiro

+0

@downvoter 이유를 설명하는 데주의해야합니까? – ispiro

0

해결 방법은 첫 번째 비밀 키를 입력하고 유료로드 데이터와 연결하는 것입니다.