Hma c SHA256 производит ключи разной длины при преобразовании из java в javascript - PullRequest
0 голосов
/ 14 июля 2020

Я работаю над переводом 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"));
}
...