2017-06-16 5 views
0

ダイジェストは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"で受信した出力は正しくありません。

+0

以前に計算されたダイジェストをSunMSCAPIでRSA暗号化して暗号化した最後の試行は、SunMSCAPIのバグのためうまく終了しませんでした。他の暗号化プロバイダを使用するか、Signature.signを使用してSunMSCAPIにダイジェストを計算させることをお勧めします。 – pedrofb

+0

@pedrofbあなたの答えをありがとう。オープンソースのプロバイダは何を使うべきですか? SunPkcs11はWindows版(https://stackoverflow.com/a/28643362/5285640)には対応していません。 –

+0

いいえ、代替プロバイダを提案することはできません。しかし、可能であれば、問題があるので、hash + oid +暗号化を使用する代わりに標準の署名方法を使用してください – pedrofb

答えて

0

SunMSCAPIの試し読みソースコード。ダイジェストの長さに基づいて "NONEWithRSA"を使用している間、ダイジェストのタイプを検出します。シグネチャの場合、ダイジェスト情報(AlorithmId + Digest)に署名する必要があるため、Signature APIに渡されるデータはダイジェスト長を超え、SunMSCAPIは渡されたダイジェストでサポートされないデータ長のエラーをスローします。

SunMSCAPIプロバイダで事前に作成されたダイジェストを使用することはできません。同じことがPkcs11プロバイダでうまく動作します。

関連する問題