在JCE中动态检测签名算法

时间:2018-01-19 09:02:53

标签: java digital-signature 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 7中传递OID来检测算法。

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

1 个答案:

答案 0 :(得分:2)

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

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

  • 关键算法:RSA,EC,DSA

  • 哈希算法:SHA1,SHA256等

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

使用带有SHA1的DSA查看此XMLDsig示例 xmldsig

所以,我建议将签名算法包含在调用系统发送的消息中。例如,在JWS签名中包含一个像JWS

这样的标题

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