Come scoprire l'algoritmo [crittografia] sono supportati dalla mia JVM?
-
02-10-2019 - |
Domanda
Sto usando Jasypt per la crittografia. Questo è il mio codice:
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 : Crittografia sollevò uno zione ecce. UN possibile causa è che si sta utilizzando forte gli algoritmi di crittografia e non è stato installato il Java Cryptography Ex tensione Forza (JCE) illimitato Giurisdizione I file politica in questo Java Virtual Machine
api dice:
Imposta l'algoritmo da utilizzare per la crittografia Imposta l'algoritmo di essere utilizzata per la crittografia, come PBEWithMD5AndDES.
Questo algoritmo deve essere supportato da il vostro fornitore di JCE (se si specifica uno, o il provider JVM predefinito se si non) e, se è supportato, è può anche modalità e imbottitura specificare per esso, come ALGORITMO / MODE / imbottitura.
fare riferimento: 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 sono supportati dalla mia JVM. Ora, come scoprire quali altri algoritmi di crittografia sono supportate dalla mia JVM.
Grazie,
Soluzione
Segue un elenco di tutti i fornitori e il sostenitore algoritmi. Quale versione di Java stai usando? A meno che non siete su una vecchia versione JCE dovrebbe essere incluso 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());
}
}
}
}
Modifica: 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) Creazione di un Cipher
utilizzando
cipher = Cipher.getInstance(algorithm);
3) Init vostra cifra con il tasto
cipher.init(Cipher.ENCRYPT_MODE, key);
4) Eseguire la crittografia con
byte[] encrypted = cipher.doFinal(data)
Altri suggerimenti
Lo strumento da riga di comando Jasypt è ora dotato di uno script per fare questo chiamato listAlgorithms.bat
per le finestre e listAlgorithms.sh
per Linux.
È possibile trovare le istruzioni su come scaricare e utilizzare qui: http: //www.jasypt .org / cli.html # Listing_algorithms
Se non lo avete già installato, quindi è necessario installare il JCE (Java Cryptography Extension), che fornisce il supporto per gli algoritmi.
Si può vedere come installare qui:
La libreria può essere trovato qui: http://www.oracle.com/technetwork/ java / JavaSE / tecnologia / index-jsp-136007.html
Ho provato il codice inviato da @Qwerky, ma non è molto utile. Avevo aggiunto l'ultimo fornitore BouncyCastle, ed i risultati che ho ottenuto è stato molto confuso. Questa mostra in maggior dettaglio chi è il fornitore, la versione e il tipo di algoritmo e nome.
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());
}
}
C'è ancora una domanda 'in attesa' chiesto da Qwerky: perché utilizzando Jasypt invece di usare javax.crypto
Bene, mi consiglia di utilizzare Jasypt in quanto è un modo semplice per crypto per i principianti e altamente configurabile per utenti esperti.
Con Jasypt, è possibile iniziare a prendere vantaggio di javax.crypto rapidamente con un po 'di conoscenza della JCE e la crittografia. Se si desidera gestire le password degli utenti o dati Decrypt / cifrare, il framework fornisce una semplice astrazione alla domanda.
Nello stesso tempo, il quadro espone tutte le possibilità della specifica JCE per consentire agli utenti esperti di essere in pieno controllo.
In aggiunta a questo, Jasypt fornisce molte altre caratteristiche out-of-the-box per le domande ben noti (si tratta di dati sensibili memorizzati nel database, ...)