Ответ
Работал с криптографическими операциями с использованием стандартных Java-библиотек javax.crypto и java.security, а также сторонних библиотек для хеширования паролей.
1. Симметричное шифрование (AES): Используется для шифрования/дешифрования данных одним ключом.
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;
public class AesExample {
public static String encrypt(String plainText, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static SecretKey generateKey() throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // Размер ключа: 128, 192 или 256 бит
return keyGen.generateKey();
}
}
2. Асимметричное шифрование (RSA): Использует пару ключей: публичный для шифрования, приватный для дешифрования.
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair();
3. Хеширование и хранение паролей: Прямое хеширование (SHA-256) небезопасно для паролей. Используются специальные алгоритмы.
- PBKDF2 (стандартный в Java):
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 310000, 256); SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); byte[] hash = factory.generateSecret(spec).getEncoded(); - BCrypt (рекомендуется, через библиотеку Spring Security или jBCrypt):
String hashedPassword = BCrypt.hashpw(plainPassword, BCrypt.gensalt()); boolean isMatch = BCrypt.checkpw(candidatePassword, hashedPassword);
4. Цифровые подписи (RSA, DSA): Для проверки целостности и авторства данных.
Важные практики:
- Не храните ключи в коде. Используйте secure vault (HashiCorp Vault, AWS KMS) или переменные окружения.
- Используйте криптографически стойкие генераторы случайных чисел (
SecureRandom). - Для паролей всегда используйте адаптивные функции хеширования (BCrypt, Argon2, PBKDF2) с солью (salt).
Ответ 18+ 🔞
А, криптография! Ну, это ж святое, блядь. Сидишь такой, думаешь: "Щас я тут всё зашифрую, и будет нам счастье". А потом оказывается, что ключ ты в коде оставил, и любой, кто в репу заглянет, тебе всю твою "защищённую" переписку на ужин прочитает. Пиздец, а не безопасность.
Ладно, слушай сюда, разбираем по косточкам, что у нас тут есть.
1. Симметричное шифрование (AES):
Это когда у тебя один ключ на всех, как от гаража. Им и закрываешь, и открываешь. В Java это через javax.crypto делается. Главное — ключ не потеряй, а то останешься как дурак перед запертым гаражом с тачкой внутри.
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;
public class AesExample {
public static String encrypt(String plainText, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static SecretKey generateKey() throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // Размер ключа: 128, 192 или 256 бит
return keyGen.generateKey();
}
}
Смотри, KeyGenerator — это твой личный кузнец, который выковывает ключ. Укажешь ему 256 бит — получишь здоровенную дубину, которую в коде хранить — чистое самоубийство. Не храни ключи в коде, ёпта! Это как писать PIN-код от карты на самой карте фломастером.
2. Асимметричное шифрование (RSA): А вот это уже поинтереснее. Тут у тебя целая парочка: публичный ключ и приватный. Публичный — это как адрес твоего почтового ящика на улице. Все могут в него записку кинуть (зашифровать). А приватный ключ — это ключ от этого ящика, который только у тебя. Им ты открываешь и читаешь.
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair();
2048 бит — это сейчас стандарт, меньше уже не комильфо. А приватный ключ — это святая святых. Его потерять — это всё, пиши пропало, конец светлой эпохе.
3. Хеширование паролей — вот где собака порылась!
Многие, блядь, до сих пор думают, что SHA-256 — это круто и безопасно для паролей. Да хуй там! Это быстро, значит, злоумышленник может за секунду миллионы комбинаций перебрать. Нам нужно такое, чтобы он обосрался, пока один пароль проверяет.
-
PBKDF2: Стандартный дедушка в Java. Ты ему пароль, соль (это такая случайная приправа) и скажешь: "работай, сука, 310 тысяч раз!" Он и будет тупить, замедляя атакующего.
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 310000, 256); SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); byte[] hash = factory.generateSecret(spec).getEncoded(); -
BCrypt: А это уже красавчик, рекомендованный. Он сам и соль себе подбирает, и работу себе создаёт. Через библиотеку jBCrypt всё делается в две строчки.
String hashedPassword = BCrypt.hashpw(plainPassword, BCrypt.gensalt()); boolean isMatch = BCrypt.checkpw(candidatePassword, hashedPassword);Вот это — правильный путь. Никаких своих велосипедов,
MD5и прочей хуйни из 90-х.
4. Цифровые подписи: Это чтобы доказать, что письмо написал именно ты, а не какой-то левый мудак от твоего имени. Принцип как в RSA: подписываешь приватным, все проверяют твоим же публичным.
И главное, блядь, практики, которые спасут твою репутацию:
- Ключи в коде — это пиздец. Серьёзно. Выноси их в переменные окружения, в специальные хранилища (Vault, KMS). Представь, что твой ключ — это фотка твоего голого очка. Ты бы её в репозиторий выложил?
SecureRandom— твой друг. ОбычныйRandomпредсказуем, как сюжет мыльной оперы. Для всего, что связано с безопасностью (соли, ключи), юзай толькоSecureRandom.- Пароли — только адаптивное хеширование с солью. BCrypt, Argon2, PBKDF2. Соль — это обязательно, чтобы две одинаковые пароли давали разный хеш. Иначе у тебя все пользователи с паролем "123456" будут как на ладони.
Вот и вся магия. Выглядит сложно, но если не накосячить с базовыми вещами (типа хранения ключей), то жить можно. Главное — не изобретай свою криптографию, а то охуеешь потом от результатов.