Java セキュリティ プロバイダーを使用したダイジェストと署名の分離

ホルスト

実装の詳細により、ハッシュと署名の生成を分割する必要があります。「NONEwithRSA」署名アルゴリズムを使用してこれを達成しようとしました。

これは基本的な作業例です:

public void rsaSignatureIntegrityTest() {
    KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
    gen.initialize(2048, new SecureRandom());
    KeyPair pair = gen.generateKeyPair();

    byte[] digest = MessageDigest.getInstance("SHA-256").digest(MESSAGE);
    Signature signer = Signature.getInstance("NONEwithRSA");
    signer.initSign(pair.getPrivate());
    signer.update(digest);
    byte[] signed = signer.sign();

    Signature verifier = Signature.getInstance("SHA256withRSA");
    verifier.initVerify(pair.getPublic());
    verifier.update(MESSAGE);
    verifier.verify(signed);
}

これを実行すると、verifier.verify()メソッドは Signature 例外をスローします。

java.security.SignatureException: Signature encoding error
    at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:204)
    at java.security.Signature$Delegate.engineVerify(Signature.java:1219)
    at java.security.Signature.verify(Signature.java:652)
    at testing.rsaSignatureIntegrityTest(testing.java:38)
    ...
Caused by: java.io.IOException: Sequence tag error
    at sun.security.util.DerInputStream.getSequence(DerInputStream.java:297)
    at sun.security.rsa.RSASignature.decodeSignature(RSASignature.java:229)
    at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:195)
    ... 26 more

検証者オブジェクトは、署名者オブジェクトによって生成されていない何らかの DER エンコード構造を期待しているようです。

これを機能させる方法について何か提案はありますか?

ホルスト

疑われているように、RSA 署名は、ハッシュ oid を含むラップされたダイジェスト値で生成されます。bouncycastleを使用すると、これは非常に快適に実行できます。

例:

public void rsaSignatureIntegrityTest() {
    KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
    gen.initialize(2048, new SecureRandom());
    KeyPair pair = gen.generateKeyPair();

    byte[] digest = MessageDigest.getInstance("SHA-256").digest(MESSAGE);
    Signature signer = Signature.getInstance("NONEwithRSA");
    signer.initSign(pair.getPrivate());
    signer.update(wrapForRsaSign(digest, "SHA-256"));
    byte[] signed = signer.sign();
    System.out.println(Base64.getEncoder().encodeToString(signed));

    Signature verifier = Signature.getInstance("SHA256withRSA");
    verifier.initVerify(pair.getPublic());
    verifier.update(MESSAGE);
    verifier.verify(signed);
}

private byte[] wrapForRsaSign(byte[] dig, String hashAlgo) {
    ASN1ObjectIdentifier oid = new DefaultDigestAlgorithmIdentifierFinder().find(hashAlgo).getAlgorithm();
    ASN1Sequence oidSeq = new DERSequence(new ASN1Encodable[] { oid, DERNull.INSTANCE });
    ASN1Sequence seq = new DERSequence(new ASN1Encodable[] { oidSeq, new DEROctetString(dig) });
    try {
        return seq.getEncoded();
    } catch (IOException e) {
        throw new DigestException(e);
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javaで特定のセキュリティプロバイダーを使用する

分類Dev

Javaセキュリティテスト

分類Dev

InternetExplorerとJavaのセキュリティ

分類Dev

JavaセキュリティとESAPI

分類Dev

OpenAMを使用したWebサービスセキュリティ(クライアントとしてのNode.jsとプロバイダーとしてのJava Jax-wsの間)

分類Dev

Javaアプリケーションでセキュリティプロバイダを複数回追加します

分類Dev

Javaセキュリティプロバイダーから特定のアルゴリズムを削除する

分類Dev

データプロバイダーを使用したJavaテストの記述

分類Dev

Javaセキュリティー-MSCAPIプロバイダー:パスワードポップアップなしで使用する方法

分類Dev

Javaセキュリティプロンプトをスキップする方法

分類Dev

Java EEのユーザー管理セキュリティ

分類Dev

Javaのセキュリティ設定を減らす

分類Dev

Javaの春のセキュリティ - AUTHORIZEの問題点

分類Dev

Java用のセキュリティ制約Libertyの適用

分類Dev

Lotus NotesAgent-Javaセキュリティエラー

分類Dev

Lotus NotesAgent-Javaセキュリティエラー

分類Dev

Java ScriptEngineのセキュリティ問題

分類Dev

Java7u55セキュリティ警告の問題

分類Dev

Javaセキュリティダイアログにチェックボックスがありません

分類Dev

春のセキュリティは、JavaとAngular2でログイン

分類Dev

Javaでセキュリティプロバイダーを使用するにはどうすればよいですか?

分類Dev

javaおよびhibernateを使用したデータ「セキュリティ」

分類Dev

JAVA署名オブジェクト-インストールされているプロバイダーがこのキーをサポートしていません:sun.security.rsa.RSAPrivateCrtKeyImpl

分類Dev

OSGiセキュリティのJavaセキュリティマネージャにすべてのアクセス許可を付与する必要がある理由

分類Dev

Angular2finalのプロバイダー依存関係を使用した分離された単体テスト

分類Dev

スプリングセキュリティ構成xmlをJavaに

分類Dev

Springセキュリティ:XML設定からのJava設定を使用した認証マネージャーとグローバルセキュリティ設定

分類Dev

Java EE7を使用したセキュリティ+認証+承認

分類Dev

ActiveDirectoryとSitecoreセキュリティプロバイダー

Related 関連記事

  1. 1

    Javaで特定のセキュリティプロバイダーを使用する

  2. 2

    Javaセキュリティテスト

  3. 3

    InternetExplorerとJavaのセキュリティ

  4. 4

    JavaセキュリティとESAPI

  5. 5

    OpenAMを使用したWebサービスセキュリティ(クライアントとしてのNode.jsとプロバイダーとしてのJava Jax-wsの間)

  6. 6

    Javaアプリケーションでセキュリティプロバイダを複数回追加します

  7. 7

    Javaセキュリティプロバイダーから特定のアルゴリズムを削除する

  8. 8

    データプロバイダーを使用したJavaテストの記述

  9. 9

    Javaセキュリティー-MSCAPIプロバイダー:パスワードポップアップなしで使用する方法

  10. 10

    Javaセキュリティプロンプトをスキップする方法

  11. 11

    Java EEのユーザー管理セキュリティ

  12. 12

    Javaのセキュリティ設定を減らす

  13. 13

    Javaの春のセキュリティ - AUTHORIZEの問題点

  14. 14

    Java用のセキュリティ制約Libertyの適用

  15. 15

    Lotus NotesAgent-Javaセキュリティエラー

  16. 16

    Lotus NotesAgent-Javaセキュリティエラー

  17. 17

    Java ScriptEngineのセキュリティ問題

  18. 18

    Java7u55セキュリティ警告の問題

  19. 19

    Javaセキュリティダイアログにチェックボックスがありません

  20. 20

    春のセキュリティは、JavaとAngular2でログイン

  21. 21

    Javaでセキュリティプロバイダーを使用するにはどうすればよいですか?

  22. 22

    javaおよびhibernateを使用したデータ「セキュリティ」

  23. 23

    JAVA署名オブジェクト-インストールされているプロバイダーがこのキーをサポートしていません:sun.security.rsa.RSAPrivateCrtKeyImpl

  24. 24

    OSGiセキュリティのJavaセキュリティマネージャにすべてのアクセス許可を付与する必要がある理由

  25. 25

    Angular2finalのプロバイダー依存関係を使用した分離された単体テスト

  26. 26

    スプリングセキュリティ構成xmlをJavaに

  27. 27

    Springセキュリティ:XML設定からのJava設定を使用した認証マネージャーとグローバルセキュリティ設定

  28. 28

    Java EE7を使用したセキュリティ+認証+承認

  29. 29

    ActiveDirectoryとSitecoreセキュリティプロバイダー

ホットタグ

アーカイブ