发布于2026-07-06 阅读(0)
扫一扫,手机访问
本文详解如何在 Ja va XML Digital Signature(JSR 105)中正确配置并使用 W3C 标准的 RSA-SHA256 签名算法,解决因 URI 错误或 JDK 版本兼容性导致的 NoSuchAlgorithmException: unsupported algorithm 异常。
在 Ja va 里做符合 W3C 规范的 XML 数字签名时,RSA-SHA256 已经是替代那个老掉牙的 RSA-SHA1 的标配了。但很多开发者一上来就踩坑——写错了算法标识符(URI),然后眼睁睁看着 ja va.security.NoSuchAlgorithmException: unsupported algorithm 砸到脸上。这里有个关键点需要厘清:W3C 官方定义的 RSA-SHA256 算法 URI 并不是很多人直觉以为的 http://www.w3.org/2000/09/xmldsig#rsa-sha256,而是属于 xmldsig-more 扩展命名空间下的 http://www.w3.org/2001/04/xmldsig-more#rsa-sha256。年份是 2001 不是 2000,一个字都不能错。
下面是一个基于 ja vax.xml.crypto.dsig API 的正确示例,直接照着抄就能跑通:
import ja vax.xml.crypto.dsig.*;import ja vax.xml.crypto.dsig.spec.C14NMethodParameterSpec;import ja va.util.Collections;
// 获取工厂实例
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
// ✅ 正确:使用标准扩展 URI(注意年份为 2001,非 2000)
String rsaSha256Uri = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
// ✅ 更推荐:直接使用内置常量(JDK 7+ 支持,语义清晰且免拼写错误)
// String rsaSha256Uri = SignatureMethod.RSA_SHA256;
SignedInfo si = fac.newSignedInfo(
fac.newCanonicalizationMethod(
CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS,
(C14NMethodParameterSpec) null
),
fac.newSignatureMethod(rsaSha256Uri, null), // ← 关键:此处必须为正确 URI
references);代码不多,但最容易出问题的就是那一行 newSignatureMethod。URI 写错了,后面一切白搭。
再补充几个实际开发中容易翻车的地方:
ja va.security 配置文件里有没有 jdk.security.disabledAlgorithms 把 SHA256 给禁了。SignatureMethod.RSA_SHA256 这个常量,既避免手误,也让代码读起来清爽很多。总结一下:碰到 unsupported algorithm 异常,十有八九是 URI 没写对。牢牢记住 http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 这个标准字符串,再确保 JDK 环境没把算法给封了,问题基本就能解决。从 SHA1 迁移到 SHA256 不仅是合规要求,更是让数字签名抗碰撞能力跟上时代节奏的必要一步——该升级时别犹豫。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8