С какими алгоритмами и библиотеками шифрования вы работали в Java?

Ответ

Работал с криптографическими операциями с использованием стандартных 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" будут как на ладони.

Вот и вся магия. Выглядит сложно, но если не накосячить с базовыми вещами (типа хранения ключей), то жить можно. Главное — не изобретай свою криптографию, а то охуеешь потом от результатов.