2010-09-10 13 views
29

Sto usando Jasypt per la crittografia. Questo è il mio codice:Come scoprire quale algoritmo [crittografia] è supportato dalla mia 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); 
    } 

} 

Rimuovere il commento dalla linea di setAlgorithm e sarà un'eccezione

org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption sollevò uno zione ecce. Un possibile causa è che si sta utilizzando forti algoritmi di crittografia e non è stato installato Java Cryptography Ex tensione (JCE) forza illimitata politica Giurisdizione I file in questo Java Virtual Machine

api dice:

Imposta l'algoritmo da utilizzare per la crittografia Imposta l'algoritmo da utilizzare per la crittografia , come PBEWithMD5AndDES.

Questo algoritmo deve essere supportato da proprio provider JCE (se si specifica uno, o il provider predefinito JVM se non) e, se è supportato, è possibile anche modalità e imbottitura specificare per esso, come ALGORITHM/MODE/PADDING.

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

Ora, quando si commento 'setAlgorithm' verrà utilizzato il valore predefinito Algorithm [Credo che sia MD5], e funzionerà bene. Ciò significa che md5 è supportato dalla mia JVM. Ora, come scoprire quali altri algoritmi di crittografia sono supportati dalla mia JVM.

Grazie,

risposta

36

Segue un elenco di tutti i fornitori e il sostenitore algoritmi. Quale versione di Java stai usando? A meno che tu non sia su una vecchia versione, JCE dovrebbe essere inclusa come standard.

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: Qual è il motivo per cui non si usa la roba standard dal pacchetto javax.crypto?

1) generare un Key utilizzando

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

2) Creare un Cipher utilizzando

cipher = Cipher.getInstance(algorithm); 

3) INIT vostra cifra con la chiave

cipher.init(Cipher.ENCRYPT_MODE, key); 

4) Fare la crittografia con

byte[] encrypted = cipher.doFinal(data) 
+0

sto usando JDK 1.6 –

+4

Invece di: System.out.println ("Algoritmo:" + service.getAlgorithm()); usa System.out.println ("" + servizio); e sarete in grado di vedere i livelli di crittografia disponibili. Ad esempio, quanto segue indica che la crittografia AES a 128 bit è supportata, ma non AES 256 bit: 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 | CFB112 | CFB120 | CFB128 | OFB72 | OFB80 | OFB88 | OFB96 | OFB104 | OFB112 | OFB120 | OFB128} –

+0

Il codice elenca un sacco di algoritmi che non possono essere utilizzati. Codice non così utile – Jonas

1

C'è ancora una domanda "in sospeso" posta da Qwerky: perché usare Jasypt invece di usare javax.crypto?

Bene, mi consiglia di utilizzare Jasypt in quanto è un modo semplice per criptare per principianti e altamente configurabile per utenti esperti.

Con Jasypt, è possibile iniziare a trarre vantaggio da javax.crypto rapidamente con una minima conoscenza di JCE e della crittografia. Se si desidera gestire le password utente o crittografare/decrittografare i dati, il framework fornisce una semplice astrazione alla domanda.

Allo stesso tempo, il framework espone tutte le possibilità delle specifiche JCE per consentire agli utenti esperti di avere il pieno controllo.

In aggiunta a questo, Jasypt offre molte più funzionalità out-of-the-box per le questioni ben note (che si occupano di dati sensibili memorizzati nel database, ...)

+0

Se vuole fare una domanda non dovrebbe metterla in una risposta. Questo non è un thread di discussione – Mick

4

Lo strumento da riga di comando Jasypt viene ora con uno script per fare questo chiamato listAlgorithms.bat per Windows e listAlgorithms.sh per Linux.

Potete trovare le istruzioni su come scaricare e utilizzare qui: http://www.jasypt.org/cli.html#Listing_algorithms

2

Ho provato il codice inviato da @Qwerky, ma non è molto utile. Avevo aggiunto l'ultimo fornitore di BouncyCastle, e i risultati che ho ottenuto sono stati molto confusi. Questo mostra con maggiori dettagli chi è il provider, la versione e il tipo e il nome dell'algoritmo.

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()); 
    } 
}