【问题标题】:Signing pre-created digest using SunMSCAPI使用 SunMSCAPI 签署预先创建的摘要
【发布时间】:2017-06-16 08:20:04
【问题描述】:

摘要在一台服务器上创建并传递到另一台服务器以使用令牌/加密狗进行签名。密码 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 时,私钥被视为公钥,既不询问令牌密码,生成的签名验证也失败。同样使用带有私钥的密码也不是正确的方法(也在此处讨论 - https://bugs.openjdk.java.net/browse/JDK-7050158 )。

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

【问题讨论】:

  • 由于 SunMSCAPI 中的错误,我上次使用 SunMSCAPI 对先前计算的摘要进行 RSA 加密的试验没有顺利完成。我建议使用其他加密提供商或使用 Signature.sign 并让 SunMSCAPI 计算摘要
  • @pedrofb 感谢您的回答。关于我应该使用哪个开源提供商的任何建议?由于 SunPkcs11 不适用于 Windows 版本(如此处所述:stackoverflow.com/a/28643362/5285640)。
  • 不,我不能建议替代提供商。但是如果可以的话,使用标准的签名方式,而不是使用hash + oid + 加密,因为有问题

标签: java cryptography digital-signature mscapi


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多