私は残りの部分で暗号化されたバイナリ情報を格納する必要があるプログラムに取り組んでいます。残念ながら、さまざまなアプリケーションに最適な暗号化方式を説明するリソースを見つけることはできません。Java暗号化:どのアルゴリズムを使用すべきですか?
暗号化が複雑で、専門家ではないので、私はJasyptというライブラリにJavaの組み込み暗号化機能をラップすることにしました。利用可能なアルゴリズムを理解するために、私はいくつかの単体テストを書きました。
最初のテストはJasyptのAlgorithmRegistry.getAllPBEAlgorithms()
関数を呼び出し、すべての利用可能な暗号化アルゴリズムを示しています
PBEWITHHMACSHA1ANDAES_128
PBEWITHHMACSHA1ANDAES_256
PBEWITHHMACSHA224ANDAES_128
PBEWITHHMACSHA224ANDAES_256
PBEWITHHMACSHA256ANDAES_128
PBEWITHHMACSHA256ANDAES_256
PBEWITHHMACSHA384ANDAES_128
PBEWITHHMACSHA384ANDAES_256
PBEWITHHMACSHA512ANDAES_128
PBEWITHHMACSHA512ANDAES_256
PBEWITHMD5ANDDES
PBEWITHMD5ANDTRIPLEDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
実行時にあなたには、いくつかの理由でサポートされたりされていないアルゴリズムを使用しようとすると、JasyptはEncryptionOperationNotPossibleException
をスローしますJavaの暗号化ルールに違反します。
PBEWITHMD5ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
:私は暗号化し、その後、いくつかの任意のデータを復号化するために「利用可能」なアルゴリズムのそれぞれを使用し、それだけで例外をスローしないものをプリントアウトしようとすると、興味深いことに、私は、このスリムダウンリストを得ます
利用可能なアルゴリズムのリストは、BouncyCastle JCEをプルしてSecurity.addProvider(new BouncyCastleProvider())
を実行して登録することで拡張できます。私はこれを実行した後、以前のテストを繰り返した場合、私はから選択するアルゴリズムのはるかに大きなリストを取得:
PBEWITHMD2ANDDES
PBEWITHMD5AND128BITAES-CBC-OPENSSL
PBEWITHMD5AND192BITAES-CBC-OPENSSL
PBEWITHMD5AND256BITAES-CBC-OPENSSL
PBEWITHMD5ANDDES
PBEWITHMD5ANDRC2
PBEWITHSHA1ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
PBEWITHSHA256AND128BITAES-CBC-BC
PBEWITHSHA256AND192BITAES-CBC-BC
PBEWITHSHA256AND256BITAES-CBC-BC
PBEWITHSHAAND128BITAES-CBC-BC
PBEWITHSHAAND128BITRC2-CBC
PBEWITHSHAAND128BITRC4
PBEWITHSHAAND192BITAES-CBC-BC
PBEWITHSHAAND2-KEYTRIPLEDES-CBC
PBEWITHSHAAND256BITAES-CBC-BC
PBEWITHSHAAND3-KEYTRIPLEDES-CBC
PBEWITHSHAAND40BITRC2-CBC
PBEWITHSHAAND40BITRC4
PBEWITHSHAANDIDEA-CBC
PBEWITHSHAANDTWOFISH-CBC
を残念ながら、今私は、これらの多くのアルゴリズムを自分のアプリケーションに最も適切な見当がつかない。私はAESが正しい方法であることを暗示しています。そして、それはPBEWITHSHA256AND256BITAES-CBC-BC
が最も長いキーの長さを持つAES実装ですが、その疑惑を確認するためにどこに行くべきか分かりません。
これらのスキームの中で、最も高いセキュリティレベルを提供し、明らかなセキュリティ問題があるものはどれですか?
EDIT:それはほぼ確実にそうハイテクない精通したユーザーの能力を超えるだろうと私は、無制限の暗号化ファイルをインストールするために、エンドユーザを必要とせずに自分のコードを配布することができるようにしたいです。私が本当に望むのは、無制限の強さの管轄権ファイルを使わずに得ることができる最も強力な暗号化です。
ないでください。すべての正しい決定を行うラッパー・ライブラリーを使用してください。 http://blog.slaks.net/2015-11-18/common-crypto-pitfalls/ – SLaks
質問を変更して、どのスキームが「最高のセキュリティレベル」を提供しているかを直接説明しました。オフサイトの説明/指示を求めることはトピックから外れており、「最高」は主観的なものであることを求めています。どちらも問題を終わらせる理由になります。 –
ライブラリは必要ありません。あまりにもJava APIを使用することは難しくありません。私の例 - https://gist.github.com/zhong-j-yu/9d23c850e580d60ddd46 – ZhongYu