2017-03-24 1 views
1

저는 기본 HMAC-SHA1 요청 서명 방법을 사용하려고했습니다.Java Hmac-Sha1 hexdigest가 Nodejs와 다릅니다

서버는 NodeJS를 사용하여 서명을 확인합니다. 내가 무엇을 가져야 하는지를 확인하기 위해 아래 스크립트를 로컬에서 실행하도록 작성했습니다 (올바른 서명을 생성하는지 확인하기 위해 cURL을 테스트했습니다). 클라이언트의 서명 코드가 70c244c06513c882bb8704c2d887a95a08d77f3a

출력합니다

const body = JSON.stringify(require('./json-events/test-event.json')); 
const crypto = require('crypto'); 

const digest = crypto.createHmac('sha1', secretKey) 
    .update(body, 'utf8') 
    .digest('hex'); 

console.log(digest); 

; , xSignature을 인쇄 할 때 5f855052675f135da151d6fa844a7678ede90afc을 제공

String xSignature = null; 
final char[] hexArray = "abcdef".toCharArray(); 

try { 
     SecretKeySpec key = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA1"); 
     Mac mac = Mac.getInstance("HmacSHA1"); 
     mac.init(key); 

     byte[] digest = mac.doFinal(body.getBytes("UTF-8")); 
     char[] hexChars = new char[digest.length * 2]; 

     for (int j = 0; j < digest.length; ++j) { 
      int v = digest[j] & 0xFF; 
      hexChars[j * 2] = hexArray[v >>> 4]; 
      hexChars[j * 2 + 1] = hexArray[v & 0x0F]; 
     } 

     xSignature = new String(hexChars); 
    } catch (Exception e) { 
    System.out.println(e.getMessage()); 
} 

.

이 디버깅을 시도하려면 빠른 python3 스크립트를 사용하여 어느 것이 옳지 않은지 확인하십시오.

import hashlib 
import hmac 
import json 
from collections import OrderedDict 

body = json.dumps(json.load(open("json-events/test-event.json"), 
       object_pairs_hook=OrderedDict), indent=2).encode("utf-8") 
sig = hmac.new(secret_key, msg=body, digestmod=hashlib.sha1).hexdigest() 

print(sig) 

반품 5f855052675f135da151d6fa844a7678ede90afc은 Java 메소드와 동일합니다.

어디에서 봐도 NodeJS 코드는 100 % 정확합니다. 그래서 Java와 Python 코드에 공통적 인 결함이 있다고 생각합니다.

모든 통찰력을 주시면 감사하겠습니다.

다음은 내가 본 다른 웹 페이지 중 일부입니다. 대신 복잡한 JSON 문자열로, 동일한 서명 생성 "ASDFGHJKL"단순한 문자열을 사용 :

NodeJS Crypto Hmac class documentation

UPDATE

Preparing a string for HMAC

Converting HMAC-SHA1 from node.js to Java

Python HMAC-SHA1 vs Java HMAC-SHA1 different results

. 따라서 Java/Python과 NodeJS를 비교할 때 다이제스트를 변경하는 보이지 않는 문자가있는 것 같습니다.

답변

0

문제의 해결 방법을 알아 냈습니다. (여기에 답변을 게시하는 것을 잊었습니다). 사전의 키 - 값 쌍 순서가 다른 경우 서명이 다릅니다. 그러한 단순한 감독.

그래서;

{ 
    "key1": "Value1", 
    "key2": "Value2" 
} 

다른 다이제스트 문자열을 생성합니다.

{ 
    "key2": "Value2", 
    "key1": "Value1" 
} 

두 개의 언어 사이에서 HMAC-SHA1을 계산할 때 키 - 값이 정확히 같은 순서로 정렬되어 있는지 확인하십시오!