Comment savoir quel algorithme [cryptage] sont pris en charge par ma machine virtuelle Java?

StackOverflow https://stackoverflow.com/questions/3683302

  •  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.

se réfèrent: http://www.jasypt.org/api/jasypt/apidocs/org/jasypt/encryption/pbe/StandardPBEStringEncryptor.html#setAlgorithm%28java.lang.String%29

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,

Était-ce utile?

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:

http://download.oracle .com / JavaSE / 1.4.2 / docs / Guide / sécurité / CryptoSpec.html # ProviderInstalling

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, ...)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top