0

摘要在一台服务器上创建并传递到另一台服务器以使用令牌/加密狗进行签名。密码 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”并且签名验证将失败。

4

1 回答 1

0

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

看起来签名不可能使用 SunMSCAPI 提供程序预先创建的摘要。虽然同样适用于 Pkcs11 提供程序。

于 2017-06-17T05:57:15.523 回答