使用SunMSCAPI签署预先创建的摘要

时间:2017-06-16 08:20:05

标签: java cryptography digital-signature mscapi

摘要在一台服务器上创建,并传递到另一台服务器,以便使用令牌/加密狗进行签名。密码API可以与PKCS11 prvoider一起使用。

    Cipher c = Cipher.getInstance("RSA");
    c.init(Cipher.ENCRYPT_MODE, pk);

    DigestInfo di = new DigestInfo(new DefaultDigestAlgorithmIdentifierFinder().find("SHA-256"), hash);
    byte[] digestInfo = di.getEncoded();
    byte[] data = c.doFinal(digestInfo);

但是,在将密码API与SunMSCAPI提供程序一起使用时,私钥被视为公钥,既不会要求令牌密码,也不会生成签名验证失败。使用带私钥的密码也不是正确的方法(这里也讨论了 - https://bugs.openjdk.java.net/browse/JDK-7050158)。

如何在避免再次创建摘要的同时使用Signature API? “NONEWithRSA”收到的输出不正确,因为我的摘要是“Sha-256”,签名验证将失败。

1 个答案:

答案 0 :(得分:0)

尝试阅读SunMSCAPI的源代码。在使用" NONEWithRSA"时,根据摘要长度找出Digest类型。对于签名,必须对摘要信息(AlorithmId + Digest)进行签名,因此传递给Signature API的数据超过了摘要长度,并且SunMSCAPI会抛出传递摘要不支持的数据长度错误。

看起来签署它不可能使用预先创建的摘要与SunMSCAPI提供程序。虽然与Pkcs11提供商一样正常。