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

Java新手在JS-Java混合沙箱打印对象仅返回类名及哈希标识求助

解决Java加密对象打印仅显示类名@哈希的问题

问题原因

你看到的javax.crypto.Mac@xxxx和javax.crypto.spec.SecretKeySpec@xxxx是Java对象默认的toString()输出——这两个类没有重写toString()方法,所以默认返回类名+哈希码,并非对象的实际有效内容。

针对SecretKeySpec的处理

SecretKeySpec是密钥的载体,要查看密钥内容,可提取其字节数组并转成Base64字符串(和你之前使用Base64的方式一致):

// 获取密钥字节数组
var secretKeyBytes = secretKey.getEncoded();
// 转成Base64可读字符串
var secretKeyStr = java.util.Base64.getEncoder().encodeToString(secretKeyBytes);
print(secretKeyStr);

针对Mac对象的处理

Mac是HMAC加密的工具实例,本身没有可直接打印的有效内容,你需要用它处理待加密数据,生成加密结果后再转成可读格式:

// 示例:待加密的明文数据
var plainData = "your-data-to-sign".getBytes();
// 生成HMAC-SHA256加密字节数组
var hmacResultBytes = sha256Hmac.doFinal(plainData);

// 方式1:转Base64字符串(和你之前的HashMap处理逻辑一致)
var hmacBase64 = java.util.Base64.getUrlEncoder().encodeToString(hmacResultBytes);
print(hmacBase64);

// 方式2:转十六进制字符串(可选,更直观的哈希格式)
var hexBuilder = new java.lang.StringBuilder();
for (var b of hmacResultBytes) {
    var hex = java.lang.Integer.toHexString(0xff & b);
    // 补零保证两位十六进制
    if (hex.length() == 1) hexBuilder.append('0');
    hexBuilder.append(hex);
}
print(hexBuilder.toString());

补充说明

你之前用HashMap能直接打印有效内容,是因为java.util.HashMap重写了toString()方法,默认会输出键值对集合;而Mac、SecretKeySpec这类加密相关类,默认toString()只输出对象标识,所以需要手动提取有效数据并格式化。

内容的提问来源于stack exchange,提问作者Krishna Krish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:18:13