저는 기본 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
Converting HMAC-SHA1 from node.js to Java
Python HMAC-SHA1 vs Java HMAC-SHA1 different results
. 따라서 Java/Python과 NodeJS를 비교할 때 다이제스트를 변경하는 보이지 않는 문자가있는 것 같습니다.