Подтвердить что ты не робот

Как узнать, какой алгоритм [шифрование] поддерживается моей 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 Ex напряжение (JCE) Неограниченная сила Файлы политики Jurisdiction в этом 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], и он будет работать нормально. Это означает, что md5 поддерживается моей JVM. Теперь, как узнать, какие другие алгоритмы шифрования поддерживаются моей JVM.

Спасибо,

4b9b3361

Ответ 1

Ниже перечислены все поставщики и сторонники алгоритмов. Какую версию 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) Создайте Cipher, используя

cipher = Cipher.getInstance(algorithm);  

3) Настройте свой шифр клавишей

cipher.init(Cipher.ENCRYPT_MODE, key);  

4) Зашифруйте с помощью

byte[] encrypted = cipher.doFinal(data)

Ответ 2

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

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

Ответ 3

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

Ответ 4

Я пробовал код, отправленный @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());
    }
}

Ответ 5

Есть еще "ожидающий" вопрос, заданный Qwerky: зачем использовать Jasypt вместо использования javax.crypto?

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

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

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

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