Chiffrement Java: Quels Algorithmes Dois-Je Utiliser? [fermé]


Je travaille sur un programme qui doit stocker des informations binaires cryptées au repos. Malheureusement, je n'arrive pas à trouver une ressource qui explique quels schémas de cryptage sont les meilleurs pour différentes applications.

Comme le chiffrement est compliqué et que je ne suis pas un expert, j'ai décidé d'utiliser une bibliothèque appeléeJasypt qui enveloppe les fonctions de chiffrement intégrées de Java. Pour comprendre quels algorithmes sont disponibles pour moi, j'ai écrit quelques tests unitaires.

Les premiers appels de test La fonction AlgorithmRegistry.getAllPBEAlgorithms() de Jasypt et répertorie tous les algorithmes de chiffrement disponibles:

PBEWITHHMACSHA1ANDAES_128
PBEWITHHMACSHA1ANDAES_256
PBEWITHHMACSHA224ANDAES_128
PBEWITHHMACSHA224ANDAES_256
PBEWITHHMACSHA256ANDAES_128
PBEWITHHMACSHA256ANDAES_256
PBEWITHHMACSHA384ANDAES_128
PBEWITHHMACSHA384ANDAES_256
PBEWITHHMACSHA512ANDAES_128
PBEWITHHMACSHA512ANDAES_256
PBEWITHMD5ANDDES
PBEWITHMD5ANDTRIPLEDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40

Lors de l'exécution, Jasypt lancera un EncryptionOperationNotPossibleException si vous essayez d'utiliser un algorithme qui, pour une raison quelconque, n'est pas pris en charge ou viole les règles de chiffrement de Java. Fait intéressant, si j'essaie d'utiliser chacun des algorithmes "disponibles" pour crypter puis décrypter certaines données arbitraires, et n'imprimer que celles qui ne lèvent pas cette exception, j'obtiens cette liste allégée:

PBEWITHMD5ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40

La liste des algorithmes disponibles peut être développé en tirant dans le BouncyCastle JCE et en l'enregistrant en exécutant Security.addProvider(new BouncyCastleProvider()). Si je répète le test précédent après avoir fait cela, j'obtiens une liste beaucoup plus grande d'algorithmes à choisir:

PBEWITHMD2ANDDES
PBEWITHMD5AND128BITAES-CBC-OPENSSL
PBEWITHMD5AND192BITAES-CBC-OPENSSL
PBEWITHMD5AND256BITAES-CBC-OPENSSL
PBEWITHMD5ANDDES
PBEWITHMD5ANDRC2
PBEWITHSHA1ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
PBEWITHSHA256AND128BITAES-CBC-BC
PBEWITHSHA256AND192BITAES-CBC-BC
PBEWITHSHA256AND256BITAES-CBC-BC
PBEWITHSHAAND128BITAES-CBC-BC
PBEWITHSHAAND128BITRC2-CBC
PBEWITHSHAAND128BITRC4
PBEWITHSHAAND192BITAES-CBC-BC
PBEWITHSHAAND2-KEYTRIPLEDES-CBC
PBEWITHSHAAND256BITAES-CBC-BC
PBEWITHSHAAND3-KEYTRIPLEDES-CBC
PBEWITHSHAAND40BITRC2-CBC
PBEWITHSHAAND40BITRC4
PBEWITHSHAANDIDEA-CBC
PBEWITHSHAANDTWOFISH-CBC

Malheureusement, maintenant je n'ai aucune idée lequel de ces nombreux algorithmes est le plus approprié pour mon application. J'ai une idée que AES est la bonne façon d'aller, et il semble que PBEWITHSHA256AND256BITAES-CBC-BC est l'implémentation AES avec la plus longue longueur de clé, mais je ne sais pas où aller pour confirmer la suspicion.

Lequel de ces systèmes fournirait les niveaux de sécurité les plus élevés et lesquels présentent des problèmes de sécurité évidents?

EDIT: Je veux pouvoir distribuer mon code sans obliger l'utilisateur final à installer les fichiers de cryptographie illimités, car cela dépassera presque certainement les capacités des utilisateurs moins avertis. Ce que je veux vraiment, c'est le cryptage le plus fort que je puisse obtenir sans utiliser les fichiers de juridiction de force illimitée.

Author: MusikPolice, 2016-02-28

2 answers

Tout d'abord, vous devez installer les fichiers de cryptographie illimités à partir d'Oracle. Après cela, vous devriez avoir moins de EncryptionOperationNotPossibleExceptions et des niveaux de sécurité plus élevés devraient devenir disponibles.

De plus, pour le cryptage le plus haut niveau possible, je n'utiliserais pas du tout JaSypt, car il ne semble pas fournir de vérification d'intégrité ou d'authentification du texte chiffré. Pour juste une confidentialité qui ne semble pas avoir d'importance. Mais en pratique, vous devez vérifier cela par rapport à votre modèle de menace.

Si vous décidez d'utiliser JaSypt (ce que je n'aime pas personnellement), vous devriez probablement opter pour PBEWITHHMACSHA512ANDAES_256 comme possibilité de plus haut niveau. Assurez-vous de comprendre PBKDF2 et les facteurs de travail (nombre d'itérations, par exemple setKeyObtentionIterations.

Vous n'avez pas besoin de Château gonflable. AES est considéré comme sécurisé; tout ce que fait Bouncy Castle-pour votre exemple qui utilise JaSypt-ajoute des chiffrements obscurs. Dans la liste ci-dessus, tout autre que AES est moins sûr que AES.

 4
Author: Maarten Bodewes, 2017-03-17 13:14:46

La question initiale que vous aviez était de savoir comment crypter les données. Quel algorithme utiliser et quelle bibliothèque java?

package cryptography;

import java.security.AlgorithmParameters;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.InvalidParameterSpecException;
import java.security.spec.KeySpec;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;

public class BasicAESEncrypt {
private final byte[] SALT = {
        (byte) 0xA9, (byte) 0x9B, (byte) 0xC8, (byte) 0x32,
        (byte) 0x56, (byte) 0x35, (byte) 0xE3, (byte) 0x03
    };

private Cipher ecipher;
private Cipher dcipher;
Encoder encoder = Base64.getEncoder();
Decoder decoder = Base64.getDecoder();


BasicAESEncrypt(String password) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidParameterSpecException, InvalidAlgorithmParameterException{
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

    KeySpec spec = new PBEKeySpec(password.toCharArray(), SALT, 65536, 256);
    SecretKey tmp = factory.generateSecret(spec);        

    SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

    ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    ecipher.init(Cipher.ENCRYPT_MODE, secret);

    AlgorithmParameters params = ecipher.getParameters();
    byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();

    dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    dcipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
}

public String encrypt(String encrypt) throws Exception {
    byte[] bytes = encrypt.getBytes("UTF8");
    byte[] encrypted = encrypt(bytes);
    return encoder.encodeToString(encrypted);
}

public byte[] encrypt(byte[] plain) throws Exception {
    return ecipher.doFinal(plain);
}

public String decrypt(String encrypt) throws Exception {
    byte[] decodedData = decoder.decode(encrypt);
    byte[] decrypted = decrypt(decodedData);
    return new String(decrypted, "UTF8");
}

public byte[] decrypt(byte[] encrypt) throws Exception {
    return dcipher.doFinal(encrypt);
}

public static void main(String[] args) throws Exception {
    String message = "Wire message for encryption";
    String password  = "TopSecretKey";

    try {
        BasicAESEncrypt app = new BasicAESEncrypt(password);

        String encrypted = app.encrypt(message);
        System.out.println("Encrypted string is: " + encrypted);

        String decrypted = app.decrypt(encrypted);
        System.out.println("Decrypted string is: " + decrypted);
    } catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException
            | InvalidParameterSpecException | InvalidAlgorithmParameterException e1) {
        e1.printStackTrace();
    }
    try {
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

 -3
Author: Learner, 2016-02-28 18:55:58