Java поддерживает множество безопасных алгоритмов шифрования, но некоторые из них слишком слабы для использования в приложениях с высокими требованиями к безопасности. Например, алгоритм шифрования Data Encryption Standard(DES) считается крайне небезопасным; сообщения, зашифрованные с помощью DES, были расшифрованы методом подбора в течение одного дня такими машинами, как Deep Crack(EFF) от Electronic Frontier Foundation.
Более безопасный алгоритм шифрования — AES — Advanced Encryption Standard. AES был установлен в качестве стандарта Национальным институтом стандартов и технологий США(NIST) в 2001 году. Он был выбран в результате конкурса для замены старого Data Encryption Standard(DES). Сегодня шифрование AES используется в США для защиты конфиденциальных, но несекретных материалов, поэтому можно сказать, что оно достаточно безопасно.
Научитесь использовать шифрование Java AES-256 для создания безопасных паролей и расшифровки для проверки паролей.
1. Что такое AES(расширенный стандарт шифрования)?
AES — широко используемый симметричный алгоритм шифрования для защиты данных посредством шифрования и дешифрования. AES — это алгоритм с симметричным ключом, что означает, что один и тот же ключ используется как для шифрования, так и для дешифрования данных. Этот ключ называется секретным ключом.
Поскольку для процессов шифрования и дешифрования используется один и тот же ключ, отправитель и получатель должны знать и использовать один и тот же секретный ключ.
AES работает с блоками данных фиксированного размера. Данные делятся на блоки, и каждый блок шифруется отдельно. Он способен обрабатывать 128-битные блоки, используя ключи размером 128, 192 и 256 бит. Помните, что чем больше размер ключа, тем сильнее шифрование.
AES может использоваться в различных режимах работы, таких как электронная кодовая книга(ECB), цепочка блоков шифра(CBC), режим Галуа/счетчика(GCM) и других, для удовлетворения различных требований к шифрованию.
- ECB(по умолчанию): в этом режиме каждый блок данных шифруется независимо с помощью одного и того же ключа шифрования. Это означает, что идентичные блоки открытого текста приведут к идентичным блокам зашифрованного текста. ECB не подходит для шифрования больших объемов данных или данных с шаблонами, поскольку он не обеспечивает конфиденциальности за пределами отдельных блоков.
- CBC: режим CBC решает проблему идентичных блоков открытого текста в ECB. Он вводит вектор инициализации(IV) в первый блок и выполняет операцию XOR предыдущего блока зашифрованного текста с текущим блоком открытого текста перед шифрованием. Режим CBC обеспечивает более высокий уровень безопасности, чем ECB, и широко используется в защищенных протоколах связи, таких как SSL/TLS, IPsec и VPN.
Предполагалось, что AES будет легко внедряться в аппаратное и программное обеспечение, а также работать в ограниченных средах и обеспечивать хорошую защиту от различных методов атак.
2. Пример шифрования AES-256
Программа Java для шифрования пароля(или любой информации) с использованием AES 256 бит.
- Метод encrypt() принимает три параметра: строку для шифрования, секретный ключ и соль.
- Для каждого шифрования генерируется случайный вектор инициализации(IV).
- Предоставленный секретный ключ и соль используются для получения ключа шифрования с помощью PBKDF2 с SHA-256.
- Секретный ключ создается и используется для шифрования AES.
- Метод возвращает зашифрованную строку в кодировке Base64.
В данном примере шифрования и дешифрования я использовал кодировку base64 в кодировке UTF-8. Это сделано для отображения вывода программы.
В вашем приложении вы также можете хранить и проверять данные в формате байтового массива.
импорт javax.crypto.Cipher;импорт javax.crypto.SecretKey;импорт javax.crypto.SecretKeyFactory;импорт javax.crypto.spec.IvParameterSpec;импорт javax.crypto.spec.PBEKeySpec;импорт javax.crypto.spec.SecretKeySpec;импорт java.security.SecureRandom;импорт java.security.spec.KeySpec;импорт java.util.Base64;импорт java.io.UnsupportedEncodingException;публичный класс AES256 {частный статический конечный int KEY_LENGTH = 256;частный статический конечный int ITERATION_COUNT = 65536;публичный статический String encrypt(String strToEncrypt, String secretKey, String salt) {пытаться {SecureRandom secureRandom = новый SecureRandom();байт[] iv = новый байт[16];secureRandom.nextBytes(iv);IvParameterSpec ivspec = новый IvParameterSpec(iv);SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");Спецификация ключа = новый PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), ITERATION_COUNT, KEY_LENGTH);SecretKey tmp = factory.generateSecret(spec);SecretKeySpec secretKeySpec = new SecretKeySpec(tmp.getEncoded(), "AES");Шифр cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivspec);byte[] cipherText = cipher.doFinal(strToEncrypt.getBytes("UTF-8"));byte[] encryptedData = new byte[iv.length + cipherText.length];System.arraycopy(iv, 0, encryptedData, 0, iv.length);System.arraycopy(cipherText, 0, encryptedData, iv.length, cipherText.length);вернуть Base64.getEncoder().encodeToString(encryptedData);} поймать(Исключение e) {// Обработайте исключение правильноe.printStackTrace();вернуть ноль;}}}
Не забудьте использовать один и тот же секретный ключ и соль при шифровании и дешифровании.
3. Пример расшифровки AES-256
Программа Java для расшифровки пароля(или любой информации) с использованием AES 256 бит.
- Метод decrypt() принимает три параметра: зашифрованную строку, секретный ключ и соль.
- IV извлекается из зашифрованных данных.
- Секретный ключ получается из предоставленного секретного ключа и соли с использованием PBKDF2 с SHA-256.
- Затем секретный ключ используется для расшифровки AES.
- Метод возвращает расшифрованную строку.
импорт javax.crypto.Cipher;импорт javax.crypto.SecretKey;импорт javax.crypto.SecretKeyFactory;импорт javax.crypto.spec.IvParameterSpec;импорт javax.crypto.spec.PBEKeySpec;импорт javax.crypto.spec.SecretKeySpec;импорт java.security.SecureRandom;импорт java.security.spec.KeySpec;импорт java.util.Base64;импорт java.io.UnsupportedEncodingException;публичный класс AES256 {частный статический конечный int KEY_LENGTH = 256;частный статический конечный int ITERATION_COUNT = 65536;public static String decrypt(String strToDecrypt, String secretKey, String salt) {пытаться {byte[] encryptedData = Base64.getDecoder().decode(strToDecrypt);байт[] iv = новый байт[16];System.arraycopy(encryptedData, 0, iv, 0, iv.length);IvParameterSpec ivspec = новый IvParameterSpec(iv);SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");Спецификация ключа = новый PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), ITERATION_COUNT, KEY_LENGTH);SecretKey tmp = factory.generateSecret(spec);SecretKeySpec secretKeySpec = new SecretKeySpec(tmp.getEncoded(), "AES");Шифр cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivspec);byte[] cipherText = новый byte[encryptedData.length - 16];System.arraycopy(encryptedData, 16, cipherText, 0, cipherText.length);byte[] decryptedText = cipher.doFinal(cipherText);вернуть новую строку(decryptedText, "UTF-8");} поймать(Исключение e) {// Обработайте исключение правильноe.printStackTrace();вернуть ноль;}}}
4. Демонстрация
Давайте протестируем наши методы шифрования и дешифрования AES256 на простой строке.
public class AESEncryptDecryptTest {public static void main(String[] args) {// Define your secret key and salt(keep these secure and don't hardcode in production)String secretKey = "MySecretKey";String salt = "MySalt";// String to be encryptedString originalString = "Hello, this is a secret message.";// Encrypt the stringString encryptedString = AES256.encrypt(originalString, secretKey, salt);if(encryptedString != null) {System.out.println("Encrypted: " + encryptedString);} else {System.err.println("Encryption failed.");return;}// Decrypt the stringString decryptedString = AES256.decrypt(encryptedString, secretKey, salt);if(decryptedString != null) {System.out.println("Decrypted: " + decryptedString);} else {System.err.println("Decryption failed.");}}}
Вывод программы.
Зашифровано: 6wbHslctOZuMj8LWSGJAaWrCFidrMfH... // Каждый раз генерируется новая строкаРасшифровка: Здравствуйте, это секретное сообщение.
Мы можем использовать шифрование AES256 для шифрования строки и расшифровку, чтобы получить исходную строку из зашифрованной строки.
5. Заключение
В этой статье мы научились выполнять шифрование и дешифрование AES-256 на основе строк. Можете свободно настраивать его в соответствии с вашими потребностями.
Эта программа должна стать отправной точкой для понимания шифрования AES-256. В производственной среде следует рассмотреть дополнительные меры безопасности, такие как безопасное управление секретными ключами и солями, а также рассмотрение любых конкретных требований вашего приложения.