Как узнать, какой алгоритм [шифрование] поддерживает моя 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) на этой виртуальной машине Java.

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], и он будет работать нормально. Это означает, что моя JVM поддерживает md5. Теперь о том, как узнать, какие еще алгоритмы шифрования поддерживает моя JVM.

Спасибо,


person Rakesh Juyal    schedule 10.09.2010    source источник


Ответы (6)


Ниже будут перечислены все поставщики и сторонники алгоритмов. Какую версию 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)
person Qwerky    schedule 10.09.2010
comment
Вместо: System.out.println (Алгоритм: + service.getAlgorithm ()); используйте System.out.println (+ сервис); и вы сможете увидеть доступные уровни шифрования. Например, следующее указывает, что поддерживается 128-битное шифрование AES, но не 256-битное AES: SunJCE: Cipher.AES - ›com.sun.crypto.provider.AESCipher ... SupportedModes = ECB | CBC | PCBC | CTR | CTS | CFB | OFB | CFB8 | CFB16 | CFB24 | CFB32 | CFB40 | CFB48 | CFB56 | CFB64 | OFB8 | OFB16 | OFB24 | OFB32 | OFB40 | OFB48 | OFB56 | OFB64 | CFB72 | CFB80 | CFB88 | CFB96 | CFB104 | CFB20112 | CFB128 | OFB72 | OFB80 | OFB88 | OFB96 | OFB104 | OFB112 | OFB120 | OFB128} - person Gary S. Weaver; 14.10.2011
comment
В коде перечислено множество алгоритмов, которые нельзя использовать. Не очень полезный код. - person Jonas; 16.01.2018

Инструмент командной строки Jasypt теперь поставляется со сценарием для этого, который называется listAlgorithms.bat для Windows и listAlgorithms.sh для Linux.

Вы можете найти инструкции по его загрузке и использованию здесь: http://www.jasypt.org/cli.html#Listing_algorithms

person Rupert Madden-Abbott    schedule 20.05.2014

Если он у вас еще не установлен, вам необходимо установить 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.

person Jivings    schedule 10.09.2010

Я пробовал код, опубликованный @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());
    }
}
person mjuarez    schedule 27.07.2014

Qwerky все еще задает нерешенный вопрос: зачем использовать Jasypt вместо javax.crypto?

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

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

В то же время фреймворк раскрывает все возможности спецификации JCE, позволяя опытным пользователям иметь полный контроль.

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

person Younes    schedule 24.01.2012
comment
Если он хочет задать вопрос, он не должен ставить его в ответ. Это не обсуждение - person Michael W; 15.02.2012

Используя Java 8 и выше,

Stream.of(Security.getProviders()).flatMap(mapper -> Stream.of(mapper.getServices())).flatMap(Set::stream)
                .map(Provider.Service::getAlgorithm).distinct().sorted().forEach(System.out::println);
person Manoj Gupta    schedule 11.06.2021