Основы криптографии
Соль (Salt) и вектор инициализации (IV)
Соль – это случайные данные, добавляемые к паролю перед хэшированием, чтобы защитить его от атак по готовым радужным таблицам.
Как работает соль?
При создании пароля генерируется уникальная соль (обычно 16 байт).
К паролю добавляется соль, и уже затем вычисляется хэш.
При проверке пароля используется та же соль.
Пример генерации соли в Java
Вектор инициализации (IV) – это случайные данные, добавляемые к первому блоку шифрованного текста, чтобы предотвратить повторяемость результатов.
IV необходим в блочных шифрах (AES, DES) для режимов CBC, GCM.
Он не секретен, но должен быть уникальным для каждого зашифрованного сообщения.
Генерация IV в Java
Режимы шифрования (ECB, CBC, GCM)
AES (Advanced Encryption Standard) – это блочный алгоритм, работающий с блоками 128 бит (16 байт).
Основные режимы работы AES:
ECB (Electronic Codebook) -> Каждый блок шифруется отдельно -> Уязвим – одинаковые блоки дают одинаковый результат
CBC (Cipher Block Chaining) -> Каждый блок XOR'ится с предыдущим перед шифрованием -> Устойчив к повторяемости, но уязвим к атаке "padding oracle"
GCM (Galois Counter Mode) -> Использует счётчик вместо цепочки блоков, добавляя аутентификацию -> Лучший вариант – быстрый, безопасный, предотвращает подмену
Почему ECB – плохой вариант?
ECB небезопасен, потому что одинаковые блоки данных дают одинаковый зашифрованный результат. Это делает возможной атаку на шаблоны в данных.
Пример ECB в Java
CBC – более безопасный вариант
CBC использует IV, который предотвращает повторяемость.
Пример AES-CBC в Java
#Java #Training #Medium #Crypto #Salt #IV #ECB #CBC #GCM #AES_256
Соль (Salt) и вектор инициализации (IV)
Соль – это случайные данные, добавляемые к паролю перед хэшированием, чтобы защитить его от атак по готовым радужным таблицам.
Как работает соль?
При создании пароля генерируется уникальная соль (обычно 16 байт).
К паролю добавляется соль, и уже затем вычисляется хэш.
При проверке пароля используется та же соль.
Пример генерации соли в Java
import java.security.SecureRandom;
import java.util.Base64;
public class SaltExample {
public static void main(String[] args) {
byte[] salt = new byte[16]; // 16 байт соли
new SecureRandom().nextBytes(salt);
System.out.println("Сгенерированная соль: " + Base64.getEncoder().encodeToString(salt));
}
}
Вектор инициализации (IV) – это случайные данные, добавляемые к первому блоку шифрованного текста, чтобы предотвратить повторяемость результатов.
IV необходим в блочных шифрах (AES, DES) для режимов CBC, GCM.
Он не секретен, но должен быть уникальным для каждого зашифрованного сообщения.
Генерация IV в Java
import java.security.SecureRandom;
import java.util.Base64;
public class IVExample {
public static void main(String[] args) {
byte[] iv = new byte[16]; // IV должен быть 16 байт для AES
new SecureRandom().nextBytes(iv);
System.out.println("Сгенерированный IV: " + Base64.getEncoder().encodeToString(iv));
}
}
Режимы шифрования (ECB, CBC, GCM)
AES (Advanced Encryption Standard) – это блочный алгоритм, работающий с блоками 128 бит (16 байт).
Основные режимы работы AES:
ECB (Electronic Codebook) -> Каждый блок шифруется отдельно -> Уязвим – одинаковые блоки дают одинаковый результат
CBC (Cipher Block Chaining) -> Каждый блок XOR'ится с предыдущим перед шифрованием -> Устойчив к повторяемости, но уязвим к атаке "padding oracle"
GCM (Galois Counter Mode) -> Использует счётчик вместо цепочки блоков, добавляя аутентификацию -> Лучший вариант – быстрый, безопасный, предотвращает подмену
Почему ECB – плохой вариант?
ECB небезопасен, потому что одинаковые блоки данных дают одинаковый зашифрованный результат. Это делает возможной атаку на шаблоны в данных.
Пример ECB в Java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;
public class ECBExample {
public static void main(String[] args) throws Exception {
String plaintext = "AAAAAAAAAAAAAAAAAAAAAAAA"; // 24 байта - два одинаковых блока
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey key = keyGen.generateKey();
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(plaintext.getBytes());
System.out.println("Зашифрованный текст (ECB): " + Base64.getEncoder().encodeToString(encrypted));
}
}
Использовать ECB не рекомендуется!
CBC – более безопасный вариант
CBC использует IV, который предотвращает повторяемость.
Пример AES-CBC в Java
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class CBCExample {
public static void main(String[] args) throws Exception {
String plaintext = "Hello, Secure World!";
byte[] key = new byte[16]; // 128-битный ключ
byte[] iv = new byte[16]; // IV
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encrypted = cipher.doFinal(plaintext.getBytes());
System.out.println("Зашифрованные данные (CBC): " + Base64.getEncoder().encodeToString(encrypted));
}
}
#Java #Training #Medium #Crypto #Salt #IV #ECB #CBC #GCM #AES_256
GCM – лучший вариант
GCM добавляет аутентификацию (AEAD), предотвращая подмену данных.
Пример AES-GCM в Java
Современные алгоритмы шифрования
AES-256 (Advanced Encryption Standard)
Симметричный алгоритм (один ключ).
Очень быстрый и безопасный.
Используется в VPN, TLS, защищённых хранилищах.
RSA-4096
Асимметричный алгоритм (пара ключей).
Высокая безопасность, но медленный.
Используется для шифрования ключей, цифровых подписей.
Размер ключа должен быть не менее 2048 бит.
ECC (Elliptic Curve Cryptography)
Современнее RSA – обеспечивает такую же безопасность при меньшем размере ключа.
ECC-256 = безопасность RSA-3072.
Используется в блокчейне, криптовалютах, мобильных устройствах.
#Java #Training #Medium #Crypto #Salt #IV #ECB #CBC #GCM #AES_256
GCM добавляет аутентификацию (AEAD), предотвращая подмену данных.
Пример AES-GCM в Java
import javax.crypto.*;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESGCMExample {
public static void main(String[] args) throws Exception {
String plaintext = "Hello, Secure World!";
byte[] key = new byte[16];
byte[] iv = new byte[12];
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmSpec);
byte[] encrypted = cipher.doFinal(plaintext.getBytes());
System.out.println("Зашифрованные данные (GCM): " + Base64.getEncoder().encodeToString(encrypted));
}
}
GCM – самый защищённый вариант!
Современные алгоритмы шифрования
AES-256 (Advanced Encryption Standard)
Симметричный алгоритм (один ключ).
Очень быстрый и безопасный.
Используется в VPN, TLS, защищённых хранилищах.
RSA-4096
Асимметричный алгоритм (пара ключей).
Высокая безопасность, но медленный.
Используется для шифрования ключей, цифровых подписей.
Размер ключа должен быть не менее 2048 бит.
ECC (Elliptic Curve Cryptography)
Современнее RSA – обеспечивает такую же безопасность при меньшем размере ключа.
ECC-256 = безопасность RSA-3072.
Используется в блокчейне, криптовалютах, мобильных устройствах.
#Java #Training #Medium #Crypto #Salt #IV #ECB #CBC #GCM #AES_256