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
相关产品推荐
相关产品推荐

