2010-09-10 2 views
29

Я использую Jasypt для шифрования. Это мой код:Как узнать, какой алгоритм [шифрование] поддерживается моей JVM?

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: Encryption поднял excep Тион. возможно причина вы используете сильные алгоритмы шифрования, и вы не установили Java Cryptography Ex напряжение (ОКО) Неограниченное Strength Юрисдикция Политика файлы в этом Java Virtual Machine

апи говорит:

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

Этот алгоритм должен быть поддержан поставщика ОКО (если вы укажете один, или поставщика в 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.

Спасибо,

ответ

36

Ниже будут перечислены все поставщики и сторонника алгоритмы. Какую версию 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()); 
      } 
     } 

    } 
} 

Edit: Любая причина, почему вы не используете стандартные вещи из пакета 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) 
+0

я использую JDK 1.6 –

+4

Вместо: System.out.println ("Алгоритм:" + service.getAlgorithm()); используйте System.out.println («+ сервис»); и вы сможете увидеть доступные уровни шифрования. Например, следующее указывает на то, что поддерживается 128-битное шифрование AES, но не 256-битное AES: SunJCE: Cipher.AES -> com.sun.crypto.provider.AESCipher ... Поддерживаемые модели: 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 | CFB112 | CFB120 | CFB128 | OFB72 | OFB80 | OFB88 | OFB96 | OFB104 | OFB112 | OFB120 | OFB128} –

+0

В списке кодов много алгоритмов, которые нельзя использовать. Не очень полезный код. – Jonas

2

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

1

Существует еще «ожидающий» вопрос, заданный Кверки: зачем использовать Jasypt вместо использования javax.crypto?

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

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

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

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

+0

Если он хочет задать вопрос, он не должен отвечать на него. Это не дискуссия – Mick

4

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

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

2

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