You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于SHA-2哈希的API签名生成逻辑疑问(Java)

问题分析与解决方案

首先咱们先揪出最核心的差异:你得到的十六进制字符串和示例里的Base64字符串,其实是同一个SHA-256哈希值的不同编码形式!

1. 编码格式不匹配的问题

示例中的 PajZG3NEUUHgrycwtPKcKkvTdBg/Kkx6OhlULgSV+ko= 是SHA-256哈希字节数组的Base64编码结果,而你当前代码如果是把字节数组转成了十六进制字符串,自然会得到类似 c7477242d3901f537387b2b6c61099380634c013a060960a5bf4d87734d54f0e 的输出。

你只需要调整编码方式就能匹配示例,Java代码修改如下:

import java.security.MessageDigest;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class SignatureGenerator {
    public static void main(String[] args) throws Exception {
        String stringToHash = "field1field2field3field4field5field6field7field8";
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(stringToHash.getBytes(StandardCharsets.UTF_8));
        // 用Base64编码字节数组,而非转十六进制
        String encoded = Base64.getEncoder().encodeToString(hash);
        System.out.println(encoded); // 此时输出应该与示例一致
    }
}

2. 签名拼接逻辑的验证

再说说你对规范拼接逻辑的疑问:Signature = (field1 + field2 + field3 + field4 + field5 + field6) + (field7 + field8)。这里的括号只是分组说明,本质就是所有字段按顺序拼接,你当前的写法是对的,但要注意几个细节:

  • 确认每个字段的原始值完全符合要求(比如有没有多余的空格、换行,空字段是否需要保留占位符)
  • 严格遵循API指定的字段拼接顺序,顺序错了哈希结果肯定对不上
  • 检查字符编码:你用了StandardCharsets.UTF_8,要确认API规范是否明确要求用UTF-8,少数场景会用GBK等其他编码

3. 快速验证技巧

如果还是拿不准,可以用简单的方式交叉验证:

  • 把你拼接好的字符串输入SHA-256工具得到十六进制结果,再转成Base64,看是否和示例一致
  • 把示例的Base64字符串解码成字节数组,再转成十六进制,看是否和你生成的哈希值匹配

这样就能快速定位是编码问题还是拼接逻辑的问题啦!

内容的提问来源于stack exchange,提问作者Samuel Waithaka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:09:47