2017-06-16 48 views
0

在一台服务器上创建摘要,并将其传递到另一台服务器以使用标记/软件狗进行签名。密码API可与PKCS11 prvoider正常工作。使用SunMSCAPI签署预先创建的摘要

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); 

但在使用与SunMSCAPI提供商的API加密,私钥被视为公共密钥,既不令牌密码要求和产生的签名验证失败。同时使用私钥密码不是正确的方法(这里也讨论 - https://bugs.openjdk.java.net/browse/JDK-7050158)。

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

+0

由于SunMSCAPI中的错误,我使用SunMSCAPI到RSA的最后一次试验加密先前计算的摘要并没有完成。我建议使用其他加密提供商或使用Signature.sign并让SunMSCAPI计算摘要 – pedrofb

+0

@pedrofb感谢您的回答。我应该使用什么开源提供商的建议?由于SunPkcs11不适用于Windows版本(如此处所述:https://stackoverflow.com/a/28643362/5285640)。 –

+0

不,我不能建议替代提供者。但是,如果可以,请使用标准签名方法而不是使用hash + oid +加密,因为它存在问题 – pedrofb

回答

0

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

看起来像是签名不可能在SunMSCAPI提供程序中使用预先创建的摘要。尽管与Pkcs11提供者一样,它也能正常工作。