2017-12-10 2 views
-1

C#에 Base64 인코딩 문자열에서 해시 값을 생성하는 다음 코드가 있습니다.Java Base64 및 HmacSHA256 암호화에 대한 C#

이것은 완벽하게 작동하며 Android 앱의 Java 코드로 변환하려고했습니다. 나는

c# and java - difference between hmacsha256 hash

C# vs Java HmacSHA1 and then base64이 출처 -

에서 참조를 확인하고 자바 -

String restServiceVersion = "2017-02-22"; 

String verb = "post"; 
String resourceType = "docs"; 
String resourceId = "dbs/ToDoList/colls/Items"; 

String dateString = org.apache.http.impl.cookie.DateUtils.formatDate(new Date(System.currentTimeMillis())); 

String gmtIndex = "GMT"; 
int index = dateString.indexOf(gmtIndex); 

String dateStringFinal = dateString.substring(0, index + 3).toLowerCase(); 

String payLoad = verb +"\n" + resourceType + "\n" + resourceId + "\n" + dateStringFinal + "\n\n"; 

System.out.println(payLoad); 

String secretAccessKey = MASTER_KEY; 
String data = payLoad; 
byte[] secretKey = Base64.decode(secretAccessKey, Base64.DEFAULT); 
SecretKeySpec signingKey = new SecretKeySpec(secretKey, "HmacSHA256"); 
Mac mac = Mac.getInstance("HmacSHA256"); 
mac.init(signingKey); 
byte[] bytes = data.getBytes("UTF-8"); 
byte[] rawHmac = mac.doFinal(bytes); 

String authToken = "type=master&ver=1.0&sig=" + Base64.encodeToString(rawHmac, Base64.DEFAULT); 

C 번호와 일치하지 않는 자바에서 생성 된 authToken 값에 코드 아래 썼다. 또한 Base64 디코딩에서 생성 된 바이트 배열이 다릅니다.

올바른 방법인지 확실하지 않습니다. 누군가 좀 봐 주시겠습니까? 내가 필요한 것은 위의 C# 코드를 Java for Android 앱으로 변환하는 것입니다.

+0

그래서 값이 일치하지 않습니다. 얼마나 유익한 지 ..... ** NOT ** – Andreas

+0

base64 디코딩 후의 키 바이트가 다른 경우 sha256 해시도 분명히 다릅니다. 소스 base64로 인코딩 된 키가 둘 모두에서 동일하다는 것을 절대적으로 100 % 확실합니까? 주어진 플랫폼에 따라 어떤 결과가 나오는지 보여줄 수 있습니까? (사용중인 정확한 키가 로컬 테스트 용도로만 사용되는 경우 해당 키를 사용할 수 있습니다). –

+0

@DylanNicholson 예 소스 키와 다른 매개 변수는 동일합니다. 내가 제대로 만들었는지 걱정했다. –

답변

0

가장 일반적인 설명 : BASE64 문자열에 삽입 된 보이지 않는 유니 코드 문자 (예 : '너비가 아닌 비 결합 자')가 있습니다. 하나의 플랫폼은 base-64 디코딩을 할 때 이들을 벗겨 내고 다른 하나는 다른 키를 생성합니다.

+0

그가 제공 한 모든 정보가 주어지면 (위의 코멘트 글을 읽으십시오) 이것이 거의 확실하게 그가 관찰 한 행동을 설명하는 유일한 대답입니다. (기술적으로 NB는 "누군가 제발 좀 봐 주실 수 있습니까?"). –

관련 문제