【问题标题】:Java - Verify PKCS7 signature using sun classesJava - 使用 sun 类验证 PKCS7 签名
【发布时间】:2015-08-07 07:56:47
【问题描述】:

如何使用sun 类验证 PKCS7 签名?我知道这样做不好,但由于某些原因,我不能使用任何其他外部库的 BouncyCastle。

我可以使用以下代码从 PKCS7 获取内容:

str = str.replace("-----BEGIN PKCS7-----\n", "").replace("-----END PKCS7-----", "");
PKCS7 pkcs7 = new PKCS7(Base64.decodeBase64(str.getBytes("UTF-8")));
byte[] b = new byte[pkcs7.getContentInfo().getContent().getData().available()];
pkcs7.getContentInfo().getContent().getData().getBytes(b);
String s = new String(b, "UTF-8");
return s.substring(s.indexOf("<")); //there are some strange symbols before <?xml

但我需要先验证签名。当然,我有一个证书可以做到这一点: private X509Certificate certVerify;

谢谢!

【问题讨论】:

    标签: java security encryption digital-signature pkcs#7


    【解决方案1】:

    您必须自己编写 CMS 和底层 ASN.1 BER/DER 库。 Sun 不包含任何官方 API 来处理 PKCS#7(或后续 RFC)指定的 CMS 消息。


    JRE 可能包含在 Java 的实现中有用的代码。请注意,这些类不是 API 的一部分,并且可能会随着 Sun's / Oracle's Java 的不同版本而改变。此外,它们可能根本不存在于 Java 的 3rd 方实现中。

    import sun.security.util.*;
    import sun.security.x509.AlgorithmId;
    import sun.security.x509.X500Name;
    import sun.security.x509.KeyUsageExtension;
    import sun.security.x509.PKIXExtensions;
    import sun.misc.HexDumpEncoder;
    

    这些 API 不应使用。它们甚至不能在不改变运行时的访问条件的情况下使用,例如日食。


    请注意,Bouncy Castle 库具有非常许可;您甚至可以将源代码复制到您的应用程序中(只要您将初始声明留在其中,阅读许可证了解更多详细信息)。如果您的雇主告诉您,您甚至不能使用它,那么组织中可能存在严重错误。

    【讨论】:

    • 但我在这里找到了创建签名 PKCS7 的工作代码:security.stackexchange.com/questions/13910/… 它仅使用 sun 类。真的没有办法验证签名吗?
    • 我在查看该代码后修改了我的答案。您当然可以固定您的 Java 版本(对于一般代码,尤其是与安全相关的代码来说,这是一个非常的坏主意)或使用 Sun 实现的 GPL 许可证。但在我看来,Bouncy 比这两种选择都有优势。
    • >JRE 可能包含在Java 实现中有用的代码是的,这些类我需要使用,很遗憾。您是否有使用这些类来验证 PKCS7 签名的示例?我在网上找不到一个例子
    • 即使我有,我也只会用它们来展示如何创建一个Java应用程序。我当然不会在公共论坛上发布使用这些类的代码。控制并告诉您的雇主,如果他不将此类实施决策留给他的开发人员,他就不是很聪明。如果这是强制解决方案,他/她显然无法胜任建筑师的工作。
    • 问题是我们使用 sun 类来创建签名的 PKCS7 消息,而我们使用 Bouncy Castle 1.40 无法做到这一点。 Bouncy Castle 1.40 可用于验证签名,但我的团队负责人说最好使用相同的类来签名和验证签名。如果这是我的决定,我将使用 BC。如果我们更新 BC,就会有一些代码因此而中断。 Java版本在可预见的将来不会更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2018-09-16
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多