Передача конфиденциальных данных, таких как простой текстовый пароль, по проводам всегда уязвима для безопасности. Всегда рекомендуется шифровать такую информацию и использовать SSL для передачи этих конфиденциальных данных. Для этого в Java предусмотрен несколько алгоритмов шифрования. В этом посте мы обсудим Алгоритм симметричного шифрования AES (Advanced Encryption Standard) в Java с режимом CBC, который работает быстрее и безопаснее, чем 3DES.
Тип шифрования
Как известно, существует 2 основных типа шифрования — асимметричное и симметричное шифрование. Асимметричное шифрование использует два разных ключа в качестве открытого и закрытого ключей. Здесь вы можете зашифровать конфиденциальную информацию с помощью открытого ключа, и для его расшифровки используется соответствующий закрытый ключ. Асимметричное шифрование обычно используется, когда задействованы 2 разные конечные точки, такие как VPN-клиент и сервер, SSH и т. Д.
Точно так же у нас есть другой метод шифрования, называемый симметричным шифрованием. Этот тип шифрования использует один ключ, известный как закрытый ключ или секретный ключ, для шифрования и дешифрования конфиденциальной информации. Этот тип шифрования очень быстр по сравнению с асимметричным шифрованием и используется в системы, такие как система баз данных. Некоторыми примерами симметричного шифрования являются Twofish, Blowfish, 3 DES, AES.
Что такое шифрование AES
AES расшифровывается как Advanced Encryption System и ее симметричный алгоритм шифрования. Это спецификация для шифрования электронных данных, созданная Национальным институтом стандартов и технологий США (NIST) в 2001 году. Вот ссылка на вики для AES. Движок AES требует простого текста и секретного ключа для шифрования, и тот же секретный ключ требуется для его повторной расшифровки.
Чтобы увидеть, как AES-шифрование работает на практике, вы можете проверить это — AES Encryption Tool
Входные данные могут быть 128-битными или 192-битными или 256-битными, и генерируется соответствующий бит шифрованного текста.
Шифрование AES на Java
Ниже приведен пример программы в Java, которая выполняет шифрование AES. Здесь мы используем AES с режимом CBC для шифрования сообщения, поскольку режим ECB не является семантически безопасным. Режим IV также должен быть рандомизирован для режима CBC.
Если один и тот же ключ используется для шифрования всего простого текста, и если злоумышленник находит этот ключ, то весь шифр может быть расшифрован аналогичным образом. Мы можем использовать соли и итерации для дальнейшего улучшения процесса шифрования. В следующем примере мы используя 128-битный ключ шифрования. Вот онлайн-инструмент для шифрования aes .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
private static final String key = "aesEncryptionKey" ; private static final String initVector = "encryptionIntVec" ; public static String encrypt(String value) { try { IvParameterSpec iv = new IvParameterSpec(initVector.getBytes( "UTF-8" )); SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes( "UTF-8" ), "AES" ); Cipher cipher = Cipher.getInstance( "AES/CBC/PKCS5PADDING" ); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte [] encrypted = cipher.doFinal(value.getBytes()); return Base64.encodeBase64String(encrypted); } catch (Exception ex) { ex.printStackTrace(); } return null ; } |
01
02
03
04
05
06
07
08
09
10
11
12
|
Other Interesting Posts Spring Boot Security Password Encoding using Bcrypt Encoder Spring Boot Security JWT Auth Example Spring Boot Security OAuth2 Example Spring Boot Security REST Basic Authentication Spring Boot Actuator Complete Guide Spring Boot Actuator Rest Endpoints Example Spring 5 Features and Enhancements Spring Boot Thymeleaf Example Spring Boot Security Hibernate Example with complete JavaConfig Securing REST API with Spring Boot Security Basic Authentication Websocket spring Boot Integration Without STOMP with complete JavaConfig |
Расшифровка AES на Java
Ниже приведен обратный процесс расшифровки шифра. Код не требует пояснений.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
public static String decrypt(String encrypted) { try { IvParameterSpec iv = new IvParameterSpec(initVector.getBytes( "UTF-8" )); SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes( "UTF-8" ), "AES" ); Cipher cipher = Cipher.getInstance( "AES/CBC/PKCS5PADDING" ); cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); byte [] original = cipher.doFinal(Base64.decodeBase64(encrypted)); return new String(original); } catch (Exception ex) { ex.printStackTrace(); } return null ; } |
Тестирование AES-шифрования и дешифрования
Ниже приведена реализация main () для тестирования нашей реализации AES.
1
2
3
4
5
6
7
8
|
public static void main(String[] args) { String originalString = "password" ; System.out.println( "Original String to encrypt - " + originalString); String encryptedString = encrypt(originalString); System.out.println( "Encrypted String - " + encryptedString); String decryptedString = decrypt(encryptedString); System.out.println( "After decryption - " + decryptedString); } |
Ниже приводится результат.
Вывод
Я надеюсь, что эта статья послужила вам, что вы искали. Если у вас есть что-то, что вы хотите добавить или поделиться, пожалуйста, поделитесь этим ниже в разделе комментариев. В следующем посте мы будем обсуждать совместимость AES между javascript и java.
Смотрите оригинальную статью здесь: Шифрование и дешифрование AES в Java (режим CBC)
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |