ダイジェストは1台のサーバーで作成され、トークン/ドングルを使用して署名するために別のサーバーに渡されます。 Cipher 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を使用しながら、秘密鍵は公開鍵、どちらのトークンパスワードとして扱われますが問われると、生成された署名の検証が失敗しました。また、秘密鍵でCipherを使用することも適切なアプローチではありません(https://bugs.openjdk.java.net/browse/JDK-7050158も参照)。
ダイジェスト作成をもう一度避けてSignature APIを使用するにはどうすればよいですか?ダイジェストが "Sha-256"で署名検証が失敗するため、 "NONEWithRSA"で受信した出力は正しくありません。
以前に計算されたダイジェストをSunMSCAPIでRSA暗号化して暗号化した最後の試行は、SunMSCAPIのバグのためうまく終了しませんでした。他の暗号化プロバイダを使用するか、Signature.signを使用してSunMSCAPIにダイジェストを計算させることをお勧めします。 – pedrofb
@pedrofbあなたの答えをありがとう。オープンソースのプロバイダは何を使うべきですか? SunPkcs11はWindows版(https://stackoverflow.com/a/28643362/5285640)には対応していません。 –
いいえ、代替プロバイダを提案することはできません。しかし、可能であれば、問題があるので、hash + oid +暗号化を使用する代わりに標準の署名方法を使用してください – pedrofb