web-dev-qa-db-ja.com

どのパディングがRSAのjavax.crypto.Cipherによって使用されるか

セキュリティで保護されていないチャネルを介してメッセージを送信するには、RSAを介してメッセージを復号化する必要がありますが、 Padding Oracle Attack が怖いです。したがって、私はすでに次の質問をしました:

  1. RSA暗号化メッセージの整合性を検証する方法は?
  2. javax.crypto.Cipherを使用してRSA暗号のメッセージの整合性を確保する方法

最初の質問で提案されたように、

ただし、高レベルの暗号化ライブラリを使用しているため、これについて心配する必要はありません。その図書館の作者はそれを世話するべきだった。

私は考えるべきではありません。私の知る限り、PKCS#1 v1.5のRSA実装はPadding Oracale Attackに対して脆弱であるため、 [〜#〜] oaep [〜#〜] は脆弱ではありません(正しく実装されていると仮定) )

したがって、どのパディング実装がjavax.crypt.CipherによってJava 7)によって使用されているかを知りたいです。

8
My-Name-Is

次のように完全に修飾せずに暗号をインスタンス化するときに実際に使用されるパディングは、選択したプロバイダーまたはデフォルトのプロバイダーによって異なります。

Cipher.getInstance("RSA")

Java実装を切り替えると、デフォルトが異なる可能性があり、突然、古い暗号文との互換性がなくなるため、これを行うのは悪い習慣です。常に暗号を完全修飾します。

前に述べたように、デフォルトはおそらく(多くのプロバイダーがあり、確信が持てない)PKCS#1v1.5パディングになります。別のものが必要な場合は、それを指定する必要があります。 OAEPを使用する場合は、 ここ からの完全修飾暗号文字列を次に示します。

Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
12
Artjom B.

暗号化サイトへの最初のリンク で与えられた良いアドバイスではありません。暗号化ライブラリの暗号化アルゴリズムのデフォルトに依存しないでください。これにはかなりの理由があります。

  1. さまざまな実装、さまざまなデフォルト(ほとんどの場合、Oracle/Sunのデフォルトをコピーしますが、デフォルトに関する暗号化プロバイダーの要件はありません)。
  2. 現在安全なものは明日安全とは見なされない可能性があります。下位互換性のため、デフォルトを変更することはできません。
  3. ソフトウェアを読んでいる人には、デフォルトが何であるかは不明です(文書化することはできますが、その場合は書き出す方がよいでしょう)。

Oracleが提供する SunJCEProvider のデフォルトはPKCS#1パディング("PKCS1Padding")歴史的な理由(上記の理由#2を参照)。これは十分に文書化されていません。

そのデフォルトが設定された当時、あなたは基本的に安全でない教科書RSA("NoPadding")およびPKCS#1 v1.5バージョン("PKCS1Padding"または RSAES-PKCS1-v1_5 PKCS#1 v2.1標準 )。当時 RSAES-PKCS1-v1_5は間違いなくより安全な選択でした。今すぐデフォルトをOAEPに変更すると、デフォルトを使用するすべてのRSA実装が壊れます。

(この回答内の最初のリンクにある)otusのアドバイスは、暗号化アルゴリズムよりもライブラリーのプロトコル実装に適しています。 最終的には、選択した内容のセキュリティを守ることができるはずです。

8
Maarten Bodewes

RSAを指定したときの弾力がある城のデフォルトはRSA/NONE/NOPADDINGです。

これは、RSA/ECB/NOPADDINGと同じ結果です。

0
Lord Moon