Java 使用SunMSCAPI对预先创建的摘要进行签名

Java 使用SunMSCAPI对预先创建的摘要进行签名,java,cryptography,digital-signature,mscapi,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)

摘要在一台服务器上创建,并传递给另一台服务器,以便使用令牌/加密狗进行签名。密码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);
但是,在与SunMSCAPI提供程序一起使用密码API时,私钥被视为公钥,既不询问令牌密码,也不验证生成的签名。同样,使用带有私钥的密码不是正确的方法(这里也讨论了-)


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

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


似乎无法通过SunMSCAPI提供程序使用预先创建的摘要进行签名。虽然Pkcs11提供程序也可以使用同样的方法

我上一次尝试使用SunMSCAPI对以前计算的摘要进行RSA加密时,由于SunMSCAPI中的一个错误,没有很好地完成。我建议使用其他加密提供程序或使用Signature.sign并让SunMSCAPI计算digest@pedrofb谢谢你的回答。关于我应该使用什么开源提供商有什么建议吗?由于SunPkcs11不适用于windows版本(如此处所述:)。不,我不能建议其他提供商。但是如果可以,请使用标准签名方法,而不是使用哈希+oid+加密,因为这是有问题的