getBytes () работает должным образом под Windows (Java9) и не работает под Linux - PullRequest
0 голосов
/ 14 октября 2019

Метод getBytes () работает должным образом в Windows (Java9) и не работает в Linux. Набор символов () => UTF-8 в обеих системах. Версия JVM => Java 9 (я тестировал open jvm и oracle jvm под Linux)
Код:

public static String createSign(String uri, String apiSecret) throws UnsupportedEncodingException{
    byte[] signBytes = calculateSignBytes(uri, apiSecret);
    return bytesToHexString(signBytes);
}

private static byte[] calculateSignBytes(String uri, String secret) throws UnsupportedEncodingException {

    try {
        Mac mac = Mac.getInstance(ALGORITHM);
        SecretKeySpec secretKeySpec = new SecretKeySpec(secret.getBytes(), ALGORITHM);
        mac.init(secretKeySpec);
        return mac.doFinal(uri.getBytes());
    } catch (NoSuchAlgorithmException | InvalidKeyException e) {
        throw new RuntimeException(e);
    }
}

private static String bytesToHexString(byte[] bytes){
    StringBuilder stringBuilder = new StringBuilder();
    for (byte b : bytes) {
        stringBuilder.append(String.format("%02x", b));
    }
    return stringBuilder.toString();
}

то же самое под Windows и Linux. Я также протестировал компиляцию и экспорт исполняемого JAR-файла под windows и установил его в Linux, все функции работают нормально, кроме кода выше.

1 Ответ

0 голосов
/ 14 октября 2019

Пожалуйста, не забывайте всегда использовать кодировку, это позволит избежать неожиданных результатов.

new SecretKeySpec(secret.getBytes ( Charsets.UTF_8 ), ALGORITHM)
...