【问题标题】:Strange SHA256 Behavior奇怪的 SHA256 行为
【发布时间】:2021-09-02 17:08:41
【问题描述】:

从屏幕截图(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

【问题讨论】:

  • 用base64代替getBytes()怎么样?
  • @dan1st 用点连接的两个项目都已经 base64 编码。
  • sourcString.getBytes(StandardCharsets.UTF_8) 是 UTF-8。我的意思是在这里使用 Base64 而不是 UTF-8。

标签: java sha256


【解决方案1】:

看起来您几乎明白了,因为您以明文形式提供 SecretKeySpec,因此您无需选中此复选框...或提供实际编码为“qwertyuiopasdfghjklzxcvbnm123456”的明文 SecretKey。

【讨论】:

  • 如果您查看代码,密钥已经是纯文本。 mac.init(new SecretKeySpec("qwertyuiopasdfghjklzxcvbnm123456".getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2015-07-20
  • 2010-10-03
  • 2021-07-12
  • 2013-10-04
  • 2019-01-23
相关资源
最近更新 更多