Безопасно ли использовать следующую библиотеку шифрования AES в PHP / Java?

1

Когда я искал реализацию AES Encryption/Decryption, я нашел несколько ссылок на вопросы в SO, например:

  1. AES Encryption Java → PHP → Java
  2. Шифрование AES в java
  3. AES-шифрование и уязвимость
  4. Безопасно ли использовать PBKDF2 с SHA256 для генерации 128-битных ключей AES?

А также я нашел следующую веб-страницу, которая предлагает простую в использовании реализацию алгоритма AES Encryption/Decryption в PHP и Java как библиотеку.

Вопрос: Безопасно ли использовать эту библиотеку реализации AES непосредственно в наших проектах разработки в реальном времени?

Это может потребовать от вас выполнения реализации исходного кода. Так как он длиннее, может возникнуть реализация PHP, после того как я поместил основную часть исходного кода Java этой библиотеки.

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;
    }
}

Примечание. Пожалуйста, не отмечайте это как слишком расширенный вопрос и игнорируйте его, я спрашиваю, потому что я должен быть уверен, прежде чем использовать его для своего следующего проекта.

Заранее благодарю за ваше драгоценное время!

Теги:
security
aes
cryptography

1 ответ

3

Нет, вы абсолютно не должны использовать этот код.

Класс AES не должен содержать дайджест, который не является частью AES. ЕЦБ небезопасен; даже CBC, вероятно, небезопасен без целостности/аутентификации. Исключения перетасовываются под стол и приводят к возврату null. Между исключениями выполнения и исключениями, которые генерируются недействительными вводами и выводами, нет никакой разницы. Поля неправильные. Используется кодировка по умолчанию. На самом деле, если бы у меня был лист оценки, он бы провалился примерно на половину очков, как минимум.

Чтобы иметь возможность использовать криптографию, вам нужно как минимум минимальное понимание предмета. В противном случае вам нужно оставить его специалистам или вам нужно использовать заранее разработанные решения известных экспертов. Просто захват кода из Интернета даст вам только ложное ощущение безопасности и источник невозможности исправить ошибки.

  • 0
    Я набрал это за 3 минуты, а это значит, что я даже не очень внимательно посмотрел на код. Битовая корзина слишком хороша для этого кода.
  • 0
    Ну, у меня есть хорошее понимание криптографии. Но дело в том, что мне нужно знать, есть ли какая-либо уязвимость в использовании библиотеки, созданной кем-то в наших проектах на уровне производства, без необходимости изобретать велосипед. Потому что, похоже, они уже знают, как работает мой алгоритм шифрования. это оно!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню