Est-il sûr d'utiliser la bibliothèque suivante de cryptage AES en PHP/Java?


Quand j'étais à la recherche sur l'implémentation du cryptage/décryptage AES, j'ai trouvé quelques liens de questions dans SO, comme ceux-ci:

  1. Le chiffrement AES Java - > PHP - > Java
  2. le chiffrement AES en java
  3. Cryptage AES et faille de sécurité
  4. Est-il sûr d'utiliser PBKDF2 avec SHA256 pour générer des clés AES 128 bits?

Et aussi j'ai trouvé la page Web suivante, qui offre une implémentation facile à utiliser d'AES Algorithme de chiffrement / décryptage en PHP et Java en tant que bibliothèque .

Question: Est-il sûr d'utiliser cette bibliothèque d'implémentation AES, directement dans nos projets de développement en temps réel?

Cela peut vous obliger à passer par l'implémentation du code source. Donc, comme il est plus long, l'implémentation PHP peut sembler, après avoir mis la partie essentielle du code source Java de cette bibliothèque.

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
Aes encryption
*/
public class AES
{

    private static SecretKeySpec secretKey ;
    private static byte[] key ;

    private static String decryptedString;
    private static String encryptedString;

    public static void setKey(String myKey){


        MessageDigest sha = null;
        try {
            key = myKey.getBytes("UTF-8");
            System.out.println(key.length);
            sha = MessageDigest.getInstance("SHA-1");
            key = sha.digest(key);
            key = Arrays.copyOf(key, 16); // use only first 128 bit
            System.out.println(key.length);
            System.out.println(new String(key,"UTF-8"));
            secretKey = new SecretKeySpec(key, "AES");


        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



    }

    public static String getDecryptedString() {
        return decryptedString;
    }
    public static void setDecryptedString(String decryptedString) {
        AES.decryptedString = decryptedString;
    }
    public static String getEncryptedString() {
        return encryptedString;
    }
    public static void setEncryptedString(String encryptedString) {
        AES.encryptedString = encryptedString;
    }
    public static String encrypt(String strToEncrypt)
    {
        try
        {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

            cipher.init(Cipher.ENCRYPT_MODE, secretKey);


            setEncryptedString(Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes("UTF-8"))));

        }
        catch (Exception e)
        {

            System.out.println("Error while encrypting: "+e.toString());
        }
        return null;
    }
    public static String decrypt(String strToDecrypt)
    {
        try
        {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");

            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            setDecryptedString(new String(cipher.doFinal(Base64.decodeBase64(strToDecrypt))));

        }
        catch (Exception e)
        {

            System.out.println("Error while decrypting: "+e.toString());
        }
        return null;
    }
}

Remarque: Veuillez ne pas marquer cela comme Question trop large et négligence, je demande parce que je dois être sûr avant de l'utiliser pour mon prochain projet.

Merci d'avance pour votre temps précieux!

Author: Community, 2015-07-07

1 answers

Non, vous ne devriez absolument pas utiliser ce code.

La classe AES ne doit pas contenir de résumé, cela ne fait pas partie d'AES. ECB n'est pas sûr; même CBC est probablement peu sûr sans intégrité / authentification. Les exceptions sont mélangées sous la table et entraîneront le retour de null. Il n'y a aucune différence entre les exceptions d'exécution et les exceptions générées par des entrées et sorties non valides. Les champs ne sont pas corrects. Encodage par défaut est utilisé. En fait, si j'avais une feuille de pointage ensuite, il échouerait sur environ la moitié des points au minimum.

Pour pouvoir utiliser la cryptographie, il faut au moins une compréhension minimale du sujet. Sinon, vous devez le laisser aux professionnels ou vous devez utiliser des solutions prédéfinies par des experts connus. Le simple fait de saisir du code sur Internet ne vous procurera qu'un faux sentiment de sécurité et une source de bogues impossibles à corriger.

 3
Author: Maarten Bodewes, 2015-07-07 18:20:49