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

«С какими алгоритмами и библиотеками шифрования вы работали в Java?» — вопрос из категории Безопасность, который задают на 10% собеседований 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).