web-dev-qa-db-ja.com

JVMでサポートされているアルゴリズム[暗号化]を確認するにはどうすればよいですか?

暗号化にJasyptを使用しています。これは私のコードです:

public class Encryptor {    
    private final static StandardPBEStringEncryptor pbeEncryptor = new StandardPBEStringEncryptor();
    private final static String PASSWORD = "FBL";
    private final static String ALGORITHM = "PBEWithMD5AndTripleDES";

    static{
        pbeEncryptor.setPassword( PASSWORD );
        //pbeEncryptor.setAlgorithm( ALGORITHM );       
    }

    public static String getEncryptedValue( String text ){
        return pbeEncryptor.encrypt( text );
    }

    public static String getDecryptedValue( String text ){
        return pbeEncryptor.decrypt( text );
    }

}

setAlgorithm行のコメントを外すと、例外がスローされます

org.jasypt.exceptions.EncryptionOperationNotPossibleException:暗号化で例外が発生しました。考えられる原因は、強力な暗号化アルゴリズムを使用していて、Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files in this Java Virtual機械

apiさんのコメント:

暗号化に使用するアルゴリズムを設定しますPBEWithMD5AndDESのように、暗号化に使用するアルゴリズムを設定します。

このアルゴリズムは、JCEプロバイダー(指定する場合)またはサポートしない場合はデフォルトのJVMプロバイダーによってサポートされる必要があり、サポートされている場合は、ALGORITHM/MODE/PADDINGのように、モードとパディングを指定することもできます。 。

参照: http://www.jasypt.org/api/jasypt/apidocs/org/jasypt/encryption/pbe/StandardPBEStringEncryptor.html#setAlgorithm%28Java.lang.String%29

これで、「setAlgorithm」とコメントすると、デフォルトのアルゴリズムが使用されます[md5だと思います]。つまり、md5は私のJVMでサポートされています。次に、私のJVMでサポートされている他の暗号化アルゴリズムを見つける方法を説明します。

おかげで、

32
Rakesh Juyal

以下に、すべてのプロバイダーとアルゴリズムサポーターをリストします。 Javaのどのバージョンを使用していますか?古いバージョンでない限り、JCEを標準として含める必要があります。

import Java.security.Provider;
import Java.security.Security;

public class SecurityListings {
    public static void main(String[] args) {
        for (Provider provider : Security.getProviders()) {
            System.out.println("Provider: " + provider.getName());
            for (Provider.Service service : provider.getServices()) {
                System.out.println("  Algorithm: " + service.getAlgorithm());
            }
        }

    }
}

編集:javax.cryptoパッケージの標準的なものを使用しない理由は何ですか?

1)を使用してKeyを生成します

Key key = SecretKeyFactory.getInstance(algorithm).generateSecret(new PBEKeySpec(password.toCharArray()));

2)を使用してCipherを作成します

cipher = Cipher.getInstance(algorithm);  

3)鍵で暗号を初期化する

cipher.init(Cipher.ENCRYPT_MODE, key);  

4)で暗号化を行う

byte[] encrypted = cipher.doFinal(data)
38
Qwerky

Jasyptコマンドラインツールには、これを行うためのスクリプトが付属しており、Windowsの場合はlistAlgorithms.bat、Linuxの場合はlistAlgorithms.shと呼ばれています。

ダウンロードして使用する方法については、こちらをご覧ください: http://www.jasypt.org/cli.html#Listing_algorithms

@Qwerkyが投稿したコードを試しましたが、あまり役に立ちません。最新のBouncyCastleプロバイダーを追加しましたが、得られた結果は非常に混乱しました。これにより、プロバイダー、バージョン、アルゴリズムのタイプと名前が誰であるかがより詳細に表示されます。

for (Provider provider : Security.getProviders()) {
    System.out.println("Provider: " + provider.getName() + " version: " + provider.getVersion());
    for (Provider.Service service : provider.getServices()) {
        System.out.printf("  Type : %-30s  Algorithm: %-30s\n", service.getType(), service.getAlgorithm());
    }
}
2
mjuarez

まだインストールしていない場合は、アルゴリズムのサポートを提供するJCE(Java Cryptography Extension)をインストールする必要があります。

あなたはここにインストールする方法を見ることができます:

http://download.Oracle.com/javase/1.4.2/docs/guide/security/CryptoSpec.html#ProviderInstalling

ライブラリはここにあります: http://www.Oracle.com/technetwork/Java/javase/tech/index-jsp-136007.html

2
Jivings

Qwerkyから「保留中」の質問がまだあります:javax.cryptoを使用する代わりにJasyptを使用する理由は?

まあ、私はJasyptを使用することをお勧めします。これは、初心者向けの暗号化の簡単な方法であり、経験豊富なユーザー向けに高度に構成可能だからです。

Jasyptを使用すると、JCEと暗号化について少しの知識があれば、javax.cryptoのメリットをすぐに利用できます。ユーザーパスワードを管理する場合でも、データを暗号化/復号化する場合でも、フレームワークは質問に対する単純な抽象化を提供します。

同時に、フレームワークはJCE仕様のすべての可能性を公開し、経験豊富なユーザーが完全に制御できるようにします。

これに加えて、Jasyptは、よく知られている質問(データベースに保存されている機密データの扱いなど)に対して、すぐに使用できる多くの機能を提供します。

1
Younes