Я использую Java Cryptography API с AES для шифрования коротких строк текста для использования при идентификации файлов cookie пользователем.
Насколько я понимаю, некоторые алгоритмы шифрования небезопасны при использовании с небольшим количеством текста по сравнению с размером ключа. Что мне нужно знать, чтобы убедиться, что я не оставляю свои данные незащищенными? Нужно ли гарантировать, что строка для шифрования длиннее ключа? Есть ли другие мины?
Для генерации ключа я делаю следующее с encryptionType = "AES"
и keySize = 128
:
public SecretKey createKey() throws NoSuchAlgorithmException {
KeyGenerator keyGen = KeyGenerator.getInstance(encryptionType);
keyGen.init(keySize); // 192 and 256 bits may not be available
return keyGen.generateKey();
}
public String encrypt(Key key, String str) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException {
Cipher ecipher = Cipher.getInstance(encryptionType);
ecipher.init(Cipher.ENCRYPT_MODE, key);
byte[] utf8 = str.getBytes("UTF8");
byte[] enc = ecipher.doFinal(utf8);
return new BASE64Encoder().encode(enc);
}
public String decrypt(Key key, String str) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, IllegalBlockSizeException, BadPaddingException {
Cipher dcipher = Cipher.getInstance(encryptionType);
dcipher.init(Cipher.DECRYPT_MODE, key);
byte[] dec = new BASE64Decoder().decodeBuffer(str);
byte[] utf8 = dcipher.doFinal(dec);
return new String(utf8, "UTF8");
}