在 JCE 中动态检测签名算法

Dynamically detect signature algorithms in JCE

我的应用程序在 Java 7. 我想对调用系统发送的签名消息进行数字验证。

我的问题是,我不知道调用系统中使用的签名算法。

在JCE运行时,如何检测签名算法来验证?

我看到的所有示例的算法都是预先知道的或硬编码的

https://www.mkyong.com/java/java-digital-signatures-example/
https://docs.oracle.com/javase/tutorial/security/apisign/index.html

我正在使用 Sun 提供的 JCE 实现,不能使用任何第三方提供商,如 Bouncy Castle。

我可以进行 ASN 解析来检测算法的 OID,但是 AFAIK JCE 也没有任何方法通过在 java 中传递 OID 来检测算法 7.

请在此处查看 Fetching MessageDigest by OID is failing in Java 7

您可以从已签名的消息中提取算法 OID,但这通常不是解决您问题的正确方法,因为您必须处理所有的可能性并且代码会太复杂

  • 填充算法:PSS、PKCS#1等

  • 密钥算法:RSA、EC、DSA

  • 哈希算法:SHA1、SHA256等

在通常的签名格式中:XMLDsigCMSPAdESJWS签名算法作为属性包含在签名容器中

请参阅使用 DSA 和 SHA1 的 XMLDsig 示例

所以,我建议在调用系统发送的消息中包含签名算法。例如在 JWS 签名中包含一个 header 像这样 {"alg":"RS256"}


当然,如果您使用一组有限的密钥和算法(即 RSA-PKCS#1 with SHA),您可以从签名中提取 OID,解密消息并解析 ASN.1