Comment savoir quel algorithme [cryptage] sont pris en charge par ma machine virtuelle Java?
-
02-10-2019 - |
Question
J'utilise Jasypt pour le chiffrement. Ceci est mon code:
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 );
}
}
Décommentez la ligne setAlgorithm
et il lancera une exception
org.jasypt.exceptions.EncryptionOperationNotPossibleException : Le chiffrement a soulevé une excep tion. UNE Cause possible est que vous utilisez une forte algorithmes de cryptage et vous n'avez pas installé Java Cryptography Ex tension (JCE) Force illimitée Compétence des fichiers de stratégie dans ce Java Machine virtuelle
api dit:
Définit l'algorithme à utiliser pour Définit l'algorithme de chiffrement pour être utilisé pour le chiffrement, comme PBEWithMD5AndDES.
Cet algorithme doit être pris en charge par votre fournisseur JCE (si vous spécifiez un, ou le fournisseur JVM par défaut si vous ne pas) et, si elle est prise en charge, vous peut également spécifier le mode et le rembourrage pour elle, comme ALGORITHME / MODE / padding.
Maintenant, quand vous commentez « setAlgorithm » il utilisera la valeur par défaut l'algorithme [je suppose qu'il est md5], et il fonctionne très bien. Cela signifie que md5 est pris en charge par ma machine virtuelle Java. Maintenant, comment savoir ce que les autres algorithmes de chiffrement sont pris en charge par ma machine virtuelle Java.
Merci,
La solution
La commande suivante liste tous les fournisseurs et le support des algorithmes. Quelle est la version de Java que vous utilisez? À moins que vous êtes sur une ancienne version JCE doit être inclus en 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: Toute raison pour laquelle vous n'utilisez pas la substance standard à partir du paquet javax.crypto?
1) Générer un Key
en utilisant
Key key = SecretKeyFactory.getInstance(algorithm).generateSecret(new PBEKeySpec(password.toCharArray()));
2) Créer un Cipher
en utilisant
cipher = Cipher.getInstance(algorithm);
3) Init votre chiffre avec la touche
cipher.init(Cipher.ENCRYPT_MODE, key);
4) Faites le chiffrant avec
byte[] encrypted = cipher.doFinal(data)
Autres conseils
L'outil de ligne de commande Jasypt vient maintenant avec un script pour ce faire appelé listAlgorithms.bat
pour Windows et pour Linux listAlgorithms.sh
.
Vous pouvez trouver des instructions sur la façon de télécharger et de l'utiliser ici: http: //www.jasypt .org / cli.html # Listing_algorithms
Si vous ne l'avez pas déjà installé, vous devez installer la JCE (Java Cryptography Extension) qui prend en charge les algorithmes.
Vous pouvez voir comment installer ici:
La bibliothèque se trouve ici: http://www.oracle.com/technetwork/ java / JavaSE / technologie / index-jsp-136007.html
J'ai essayé le code affiché par @Qwerky, mais ce n'est pas très utile. J'avais ajouté le dernier fournisseur BouncyCastle, et les résultats que j'ai obtenu étaient très confus. Cela montre de façon plus détaillée qui est le fournisseur, la version et le type d'algorithme et le nom.
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());
}
}
Il y a encore une question « en attente » demandé Qwerky: pourquoi l'utilisation Jasypt au lieu d'utiliser javax.crypto
Eh bien, je vous conseille d'utiliser Jasypt car il est un moyen simple de Crypto pour les débutants et hautement configurable pour les utilisateurs expérimentés.
Avec Jasypt, vous pouvez commencer à prendre avantage de javax.crypto rapidement avec un peu de connaissance de l'entreprise criminelle commune et la cryptographie. Si vous souhaitez gérer les mots de passe de l'utilisateur ou Crypter / Décrypter les données, le cadre offre une méthode simple abstraction à la question.
Dans le même temps, le cadre expose toutes les possibilités de la spécification de JCE pour permettre aux utilisateurs expérimentés d'être en plein contrôle.
En plus de cela, Jasypt fournit beaucoup plus de fonctionnalités hors-the-box pour des questions bien connues (traitant des données sensibles stockées dans la base de données, ...)