Как узнать, какой алгоритм [шифрование] поддерживается моей 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 line и он выдаст исключение

org.jasypt.исключения.EncryptionOperationNotPossibleException: Шифрование вызвало восклицание. Ля возможная причина в том, что вы используете strong алгоритмы шифрования и у вас нет установлена криптография Java Ex прочность напряжения (JCE) неограниченная Файлах политики юрисдикции в этой Java Виртуальный Машина!--3-->

api говорит:

задает алгоритм, который будет использоваться для шифрование задает алгоритм используется для шифрования, например PBEWithMD5AndDES.

этот алгоритм должен поддерживаться ваш поставщик JCE (если вы укажете его, или поставщик JVM по умолчанию, если вы не) и, если он поддерживается, вы смогите также определить режим и прокладку для это, как алгоритм / режим / дополнение.

см.: http://www.jasypt.org/api/jasypt/apidocs/org/jasypt/encryption/pbe/StandardPBEStringEncryptor.html#setAlgorithm%28java.lang.String%29

теперь, когда вы комментируете "setAlgorithm", он будет использовать алгоритм по умолчанию [ я думаю, это md5], и он будет работать нормально. Это означает, что md5 поддерживается моей JVM. Теперь, как узнать, какие другие алгоритмы шифрования поддерживаются моей JVM.

спасибо,

5 ответов


ниже перечислены все поставщики и сторонник алгоритмов. Какую версию 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.крипто-пакет?

1) Создать Key используя

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

2) создать Cipher используя

cipher = Cipher.getInstance(algorithm);  

3) Init ваш шифр с ключом

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 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


Я пробовал код, опубликованный @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: почему используется Jasypt вместо использования javax.крипто?

Ну, я бы рекомендовал использовать Jasypt, поскольку это простой способ криптографии для начинающих и настраиваемый для опытных пользователей.

с Jasypt вы можете начать пользоваться javax.crypto быстро с небольшим знанием JCE и криптографии. Если вы хотите управлять паролями пользователей или шифровать/расшифровывать данные, платформа предоставляет простой абстракция к вопросу.

в то же время структура предоставляет все возможности спецификации JCE, чтобы позволить опытным пользователям быть в полном контроле.

в дополнение к этому, Jasypt предоставляет гораздо больше возможностей из коробки для хорошо известных вопросов (дело с конфиденциальными данными, хранящимися в базе данных,...)