Криптография в Java: шифрование и хеширование — подробное руководство
В современном мире информационной безопасности криптография является фундаментом защиты данных. Java предоставляет мощный встроенный инструментарий для реализации шифрования и хеширования через пакеты javax.crypto и java.security. В этой статье мы подробно рассмотрим основные криптографические операции в Java: симметричное и асимметричное шифрование, хеширование паролей и работу с цифровыми подписями.
1. Основы криптографии в Java
Java Cryptography Architecture (JCA) — это фреймворк, позволяющий разработчикам легко интегрировать криптографические алгоритмы. Ключевые классы:
javax.crypto.Cipher— для шифрования и дешифрования.java.security.MessageDigest— для хеширования.java.security.KeyPairGenerator— для генерации ключей.javax.crypto.spec.SecretKeySpec— для создания симметричных ключей.
Для работы с криптографией импортируйте:
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;
2. Симметричное шифрование (AES)
Симметричное шифрование использует один ключ для шифрования и дешифрования. AES (Advanced Encryption Standard) — самый популярный алгоритм. Пример шифрования строки:
import javax.crypto.*;
import javax.crypto.spec.*;
import java.util.Base64;
public class AesExample {
public static void main(String[] args) throws Exception {
String plainText = "Секретное сообщение";
String secretKey = "0123456789abcdef"; // 16 байт для AES-128
// Создание ключа
SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// Шифрование
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("Зашифровано: " + encryptedText);
// Дешифрование
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes);
System.out.println("Расшифровано: " + decryptedText);
}
}
Важно: Режим ECB не рекомендуется для больших объёмов данных. Используйте AES/GCM/NoPadding для лучшей безопасности.
3. Асимметричное шифрование (RSA)
Асимметричное шифрование использует пару ключей: открытый (для шифрования) и закрытый (для дешифрования). RSA — классический алгоритм. Пример:
import javax.crypto.*;
import java.security.*;
import java.util.Base64;
public class RsaExample {
public static void main(String[] args) throws Exception {
// Генерация пары ключей
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair pair = keyGen.generateKeyPair();
PublicKey publicKey = pair.getPublic();
PrivateKey privateKey = pair.getPrivate();
// Шифрование открытым ключом
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal("Секретные данные".getBytes());
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("Зашифровано RSA: " + encryptedText);
// Дешифрование закрытым ключом
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
System.out.println("Расшифровано: " + new String(decryptedBytes));
}
}
4. Хеширование (SHA-256)
Хеширование — это односторонняя функция, преобразующая данные в фиксированную строку. SHA-256 — стандарт для проверки целостности данных. Пример:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class HashExample {
public static String hashWithSHA256(String input) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = digest.digest(input.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
}
public static void main(String[] args) throws Exception