Странное поведение SHA256

#java #sha256

Вопрос:

Как видно из скриншота(https://jwt.io/) что является ожидаемой подписью, я получаю неправильный java-код. Я упускаю что-то очень очевидное в коде?

введите описание изображения здесь

     package com.company;
    
    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    import java.nio.charset.StandardCharsets;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.util.Base64;
    
    public class Main {
    
        public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException {
            final Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec("qwertyuiopasdfghjklzxcvbnm123456".getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
            String sourcString = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2MjM5NTk5NDEsImV4cCI6MTY1NTQ5NTk0MSwiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIkdpdmVuTmFtZSI6IkpvaG5ueSIsIlN1cm5hbWUiOiJSb2NrZXQiLCJFbWFpbCI6Impyb2NrZXRAZXhhbXBsZS5jb20ifQ";
            byte[] signatureBytes = mac.doFinal(sourcString.getBytes(StandardCharsets.UTF_8));
            System.out.println("Signatured="   Base64.getEncoder().withoutPadding().encodeToString(signatureBytes));
        }
    }
 

ВЫВОД : Подписано=ZFrcK6AZzYCTs0ugepzcSFMxxuY5Fs0PtMXGDZtT3sA
http://tpcg.io/P0MtSDC3

Комментарии:

1. Как насчет использования base64 вместо getBytes()?

2. @dan1st два элемента, соединенные точкой, оба уже закодированы в base64.

3. sourcString.getBytes(StandardCharsets.UTF_8) является UTF-8. Я имел в виду использование Base64 вместо UTF-8 здесь.

Ответ №1:

Похоже, вы почти поняли, так как вы предоставляете секретный ключ открытым текстом, вам не нужно устанавливать этот флажок … или предоставлять секретный ключ открытым текстом, который фактически кодирует «qwertyuiopasdfghjklzxcvbnm123456».

снимите этот флажок

Комментарии:

1. Если вы посмотрите на код, секретный ключ уже является обычным текстом. mac.init(новый секретный ключ) («qwertyuiopasdfghjklzxcvbnm123456».getBytes(стандартные наборы символов. UTF_8), «HmacSHA256»));