セキュリティで保護されていないチャネルを介してメッセージを送信するには、RSAを介してメッセージを復号化する必要がありますが、 Padding Oracle Attack が怖いです。したがって、私はすでに次の質問をしました:
最初の質問で提案されたように、
ただし、高レベルの暗号化ライブラリを使用しているため、これについて心配する必要はありません。その図書館の作者はそれを世話するべきだった。
私は考えるべきではありません。私の知る限り、PKCS#1 v1.5
のRSA実装はPadding Oracale Attack
に対して脆弱であるため、 [〜#〜] oaep [〜#〜] は脆弱ではありません(正しく実装されていると仮定) )
したがって、どのパディング実装がjavax.crypt.Cipher
によってJava 7)によって使用されているかを知りたいです。
次のように完全に修飾せずに暗号をインスタンス化するときに実際に使用されるパディングは、選択したプロバイダーまたはデフォルトのプロバイダーによって異なります。
Cipher.getInstance("RSA")
Java実装を切り替えると、デフォルトが異なる可能性があり、突然、古い暗号文との互換性がなくなるため、これを行うのは悪い習慣です。常に暗号を完全修飾します。
前に述べたように、デフォルトはおそらく(多くのプロバイダーがあり、確信が持てない)PKCS#1v1.5パディングになります。別のものが必要な場合は、それを指定する必要があります。 OAEPを使用する場合は、 ここ からの完全修飾暗号文字列を次に示します。
Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
暗号化サイトへの最初のリンク で与えられた良いアドバイスではありません。暗号化ライブラリの暗号化アルゴリズムのデフォルトに依存しないでください。これにはかなりの理由があります。
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のアドバイスは、暗号化アルゴリズムよりもライブラリーのプロトコル実装に適しています。 最終的には、選択した内容のセキュリティを守ることができるはずです。
RSA
を指定したときの弾力がある城のデフォルトはRSA/NONE/NOPADDING
です。
これは、RSA/ECB/NOPADDING
と同じ結果です。