Comment savoir quel algorithme [cryptage] sont pris en charge par ma JVM?

J'utilise Jasypt pour le cryptage. C'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.exception.EncryptionOperationNotPossibleException : Le chiffrement a soulevé une excep tion. Un la cause possible est que vous utilisez fort algorithmes de chiffrement et vous n'avez pas installé le Java Cryptography Ex tension (JCE) force illimitée Fichiers de stratégie de juridiction dans ce Java Machine Virtuelle

Api dit:

Définit l'algorithme à utiliser pour cryptage Définit l'algorithme utilisé pour le cryptage, comme PBEWithMD5AndDES.

Cet algorithme doit être pris en charge par votre fournisseur JCE (si vous en spécifiez un, ou le fournisseur JVM par défaut si vous ne le faites pas) et, si elle est prise en charge, vous peut également spécifier le mode et le remplissage pour il, comme algorithme / MODE / PADDING.

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

Maintenant, lorsque vous commentez 'setAlgorithm', il utilisera l'algorithme par défaut [je suppose que c'est md5 ], et cela fonctionnera bien. Cela signifie que md5 est pris en charge par ma JVM. Maintenant, comment savoir quels autres algorithmes de chiffrement sont pris en charge par ma JVM.

Merci,

30
demandé sur Rakesh Juyal 2010-09-10 12:53:16

5 réponses

Ce qui suit répertorie tous les fournisseurs et le support des algorithmes. Quelle est la version de Java que vous utilisez? Sauf si vous êtes sur une ancienne version JCE devrait ê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());
            }
        }

    }
}

Modifier: N'importe quelle raison pour laquelle vous n'utilisez pas les choses standard du javax.paquet crypto?

1) générer un Key en utilisant

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

2) Créez un Cipher en utilisant

cipher = Cipher.getInstance(algorithm);  

3) initialisez votre chiffre avec la clé

cipher.init(Cipher.ENCRYPT_MODE, key);  

4) Faites le chiffrement avec

byte[] encrypted = cipher.doFinal(data)
37
répondu Qwerky 2013-12-04 05:10:26

L'outil de ligne de commande Jasypt est maintenant livré avec un script pour cela appelé listAlgorithms.bat pour windows et listAlgorithms.sh Pour Linux.

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

4
répondu Rupert Madden-Abbott 2014-05-20 19:27:22

Si vous ne l'avez pas déjà installé, vous devez installer 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/security/CryptoSpec.html#ProviderInstalling

La bibliothèque peut être trouvée ici: http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136007.html

2
répondu Jivings 2010-09-10 09:26:25

J'ai essayé le code posté par @ Qwerky, mais ce n'est pas très utile. J'avais ajouté le dernier fournisseur de BouncyCastle, et les résultats que j'ai obtenus étaient très confus. Cela montre plus en détail qui est le fournisseur, la version et le type et le nom de l'algorithme.

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());
    }
}
2
répondu mjuarez 2014-10-20 08:43:30

Il y a toujours une question 'en attente' posée par Qwerky: pourquoi utiliser Jasypt au lieu d'utiliser javax.crypto?

Eh bien, je recommanderais D'utiliser Jasypt car c'est un moyen simple de crypter pour les débutants et hautement configurable pour les utilisateurs expérimentés.

Avec Jasypt, vous pouvez commencer à profiter de javax.crypto rapidement avec un peu de connaissance de JCE et de la cryptographie. Que vous souhaitiez Gérer les mots de passe des utilisateurs ou chiffrer / déchiffrer des données, le framework fournit une abstraction simple à la question.

Dans le même temps, le framework expose toutes les possibilités de la spécification 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 prêtes à l'emploi pour des questions bien connues (traitant des données sensibles stockées dans la base de données, ...)

1
répondu Younes 2014-10-20 08:43:11