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

}

Беспокойство setAlgorithm линия, и это бросит исключение

org.jasypt.Exceptions.encryplationPerationNotPossibleException.: Шифрование подняло экстер. Возможная причина заключается в том, что вы используете прочные алгоритмы шифрования, и вы не установили Java Cryptography Ex напряженность (JCE) Неограниченные файлы политики политики прочности в этой виртуальной машине Java

API говорит:

Устанавливает, что алгоритм будет использоваться для шифрования, устанавливает алгоритм для использования для шифрования, таких как pbewithmd5anddes.

Этот алгоритм должен быть поддержан вашим провайдером JCE (если вы указываете One или поставщик JVM по умолчанию, если вы этого не хотите) и, если оно поддерживается, вы также можете указать режим и прокладки для него, как алгоритм / режим / прокладки Отказ

ссылаться: http://www.jasypt.org/api/jasypt/apidocs/org/jasypt/encryption/pbe/standardpbbestringcriptor.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) генерировать 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), которое обеспечивает поддержку алгоритмам.

Вы можете увидеть, как установить здесь:

http://download.orcle.com/javase/1.4.2/docs/guide/security/cryptospec.html#providerInstalling.

Библиотека можно найти здесь:http://www.orcle.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.crypto?

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top