Когда я искал реализацию AES Encryption/Decryption, я нашел несколько ссылок на вопросы в SO, например:
А также я нашел следующую веб-страницу, которая предлагает простую в использовании реализацию алгоритма 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;
}
}
Примечание. Пожалуйста, не отмечайте это как слишком расширенный вопрос и игнорируйте его, я спрашиваю, потому что я должен быть уверен, прежде чем использовать его для своего следующего проекта.
Заранее благодарю за ваше драгоценное время!
Нет, вы абсолютно не должны использовать этот код.
Класс AES не должен содержать дайджест, который не является частью AES. ЕЦБ небезопасен; даже CBC, вероятно, небезопасен без целостности/аутентификации. Исключения перетасовываются под стол и приводят к возврату null
. Между исключениями выполнения и исключениями, которые генерируются недействительными вводами и выводами, нет никакой разницы. Поля неправильные. Используется кодировка по умолчанию. На самом деле, если бы у меня был лист оценки, он бы провалился примерно на половину очков, как минимум.
Чтобы иметь возможность использовать криптографию, вам нужно как минимум минимальное понимание предмета. В противном случае вам нужно оставить его специалистам или вам нужно использовать заранее разработанные решения известных экспертов. Просто захват кода из Интернета даст вам только ложное ощущение безопасности и источник невозможности исправить ошибки.
Cipher.getInstance("AES/ECB/PKCS5Padding");
Не используйте ECB, используйте CBC. Кроме того, вы должны аутентифицировать свои шифротексты .