Криптография в Java: шифрование и хеширование — полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Криптография в 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                    

Рекомендаций