私のJVMによってどのアルゴリズム[暗号化]がサポートされているかを知る方法は?

StackOverflow https://stackoverflow.com/questions/3683302

  •  02-10-2019
  •  | 
  •  

質問

暗号化に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 );
    }

}

conemment the setAlgorithm ラインとそれは例外をスローします

org.jasypt.exceptions.encryptionOperationNotPossibleException:暗号化が発生しました。考えられる原因は、強力な暗号化アルゴリズムを使用しており、このJava仮想マシンにJava Cryptography Ex Tension(JCE)無制限の強度管轄ポリシーファイルをインストールしていないことです。

APIは言う:

暗号化に使用するアルゴリズムを設定すると、pbewithmd5anddesなどの暗号化に使用されるアルゴリズムを設定します。

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

参照: http://www.jasypt.org/api/jasypt/apidocs/org/jasypt/encryption/pbe/standpbestringencryptor.html#setalgorithm%28java.lang.string%29

「Setalgorithm」をコメントすると、デフォルトのアルゴリズム[MD5だと思います]を使用し、正常に動作します。つまり、MD5は私のJVMによってサポートされています。次に、他の暗号化アルゴリズムが私のJVMによってサポートされているものを見つける方法を知る方法。

ありがとう、

役に立ちましたか?

解決

以下には、すべてのプロバイダーとアルゴリズムサポーターがリストされます。どのバージョンの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)生成a Key 使用

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

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

cipher = Cipher.getInstance(algorithm);  

3)キーで暗号を開始します

cipher.init(Cipher.ENCRYPT_MODE, key);  

4)暗号化を行います

byte[] encrypted = cipher.doFinal(data)

他のヒント

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

ここでダウンロードして使用する方法の指示を見つけることができます。 http://www.jasypt.org/cli.html#listing_algorithms

まだインストールされていない場合は、アルゴリズムのサポートを提供するJCE(Java暗号拡張機能)をインストールする必要があります。

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

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

@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());
    }
}

Qwerkyが尋ねた「保留中の」質問がまだあります。なぜJavax.cryptoを使用する代わりにJasyptを使用するのですか?

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

jasyptを使用すると、JCEと暗号化のわずかな知識を持って、Javax.cryptoの恩恵を受けることができます。ユーザーのパスワードを管理するか、データを暗号化/復号化するかにかかわらず、フレームワークは質問に対する簡単な抽象化を提供します。

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

これに加えて、JasyPtは、よく知られている質問のために、より多くの機能をすぐに提供しています(データベースに保存されている機密データを扱う...)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top