Я работаю над переводом API из Java в Javascript (nodeJs). Проблема в том, что подписи, генерируемые кодом Java, намного короче, чем подписи в javascript. Результаты функции getSignature имеют разную длину, и поэтому всякий раз, когда я генерирую подпись в javascript, сервер не распознает ее, но будет, когда она будет сгенерирована в Java.
Я проверил, что значения в getSignatureKey одинаковы в обеих функциях, а функция getSignature использует выходные данные getSignatureKey для шифрования «НЕКОТОРЫЕ СООБЩЕНИЕ ДЛЯ ШИФРОВАНИЯ», которое будет телом запроса в виде простого текста (подтверждено, что оба имеют одинаковое содержимое и формат).
Есть ли причина, по которой выходные данные отличаются по длине? Возможно, какая-то проблема с кодировкой или что-то еще, чего я не вижу.
Использование собственной криптографической библиотеки в nodeJs следующим образом:
var getSignatureKey = function(key, api_key, dateStamp){
let kUser = HMACSHA256("CAS"+api_key, key);
let kDate = HMACSHA256(dateStamp, kUser);
let kService = HMACSHA256(SERVICE_NAME, kDate);
let kSigning = HMACSHA256("cas_request", kService);
return kSigning;
}
var getSignature = function(signature_key){
let signature_bytes = HMACSHA256("SOME MESSAGE TO ENCRYPT", signature_key);
let signature = Buffer.from(signature_bytes).toString('base64');
return signature;
}
var HMACSHA256 = function(message, secret){
let key_bytes = encoder.encode(secret);
let message_bytes = encoder.encode(message);
let hash = crypto.createHmac('sha256', key_bytes).update(message_bytes).digest();
return Uint8Array.from(hash);
}
В java У меня есть следующий код :
public static byte[] getSignatureKey(String key, String apiKey, String dateStamp, String serviceName)
throws Exception {
byte[] kSecret = key.getBytes("UTF8");
byte[] kUser = HmacSHA256("CAS" + apiKey, kSecret);
byte[] kDate = HmacSHA256(dateStamp, kUser);
byte[] kService = HmacSHA256(serviceName, kDate);
byte[] kSigning = HmacSHA256("cas_request", kService);
return kSigning;
}
public static String getSignature(byte[] signature_key) throws Exception {
return Base64.encodeBase64String(HmacSHA256("SOME MESSAGE TO ENCRYPT", signature_key));
}
public static byte[] HmacSHA256(String data, byte[] key) throws Exception {
String algorithm = "HmacSHA256";
Mac mac = Mac.getInstance(algorithm);
mac.init(new SecretKeySpec(key, algorithm));
return mac.doFinal(data.getBytes("UTF8"));
}