Java for Beginner
687 subscribers
586 photos
161 videos
12 files
904 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Основы криптографии

Соль (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
👍1
GCM – лучший вариант
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
👍1
Всем привет! 👋

Как пережили эту неделю? 🥴

А я решил (если звезды сложатся) порадовать Вас завтра разбором интересного приложения которое однозначно будет встречаться в будущих проектах - Redis!

⚠️ Что разберем:

➡️ Что такое Redis и зачем он вообще нам сдался.
➡️ Как его установить и запустить, поработаем с ним из консоли.
➡️ Внедрим Redis в простое действующее Spring приложение и проведем полевые испытания
➡️ Сделаем пару элементарных ошибок в коде и поищем их с полчаса🤣

Жду как всегда всех 👨‍💻

А всем остальным просто замечательных выходных!
🍸
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Встреча создана - https://telemost.yandex.ru/j/05760788404602

Залетаем! ✈️
Please open Telegram to view this post
VIEW IN TELEGRAM
Redis. In-memory полезность.
Встреча от 23.02.2025


Запись встречи -
YOUTUBE
RUTUBE

На сегодняшней встрече мы разобрали на примере работу in-memory хранилища Redis.

Что можно узнать из видео:
🔜 Что такое Redis, и зачем он нам нужен. Разобрали основные роли в приложении.
🔜 Как его установить и запустить, поработать с ним из консоли.
🔜 Как внедрить и настроить Redis в действующее Spring приложение и провести полевые испытания в роли кэша, очереди, консьюмера.

😋 Кроме того написали немного кода, посмотрели как все это работает, сделали немного ошибок и успешно их решили.

Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!

GitHub - https://github.com/Oleborn/Redis-Demo

Всем хорошего настроения и терпения при просмотре! 🍸
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📌 Факт дня:

А вы знали, что один программист случайно удалил половину интернета?

В марте 2016 года разработчик по имени Azer Koçulu удалил свою библиотеку JavaScript (11 строк кода!), которую использовали тысячи сайтов, и в результате интернет просто перестал работать.


Proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
✏️ Цитата дня: Джон фон Нейман

"Вычислительная машина может моделировать любую другую машину."


Фон Нейман сформулировал принцип универсальной вычислимости в своей работе 1945 года.

Почитать короткую биографию
https://habr.com/ru/companies/itglobalcom/articles/771278/

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Java Crypto API

Классы Cipher и KeyGenerator

1. Класс Cipher (шифрование и дешифрование)
Класс Cipher является основным инструментом для шифрования и дешифрования данных в Java. Он поддерживает различные алгоритмы шифрования, такие как AES, DES, RSA и другие.

Как работает Cipher под капотом?
Cipher использует провайдеры безопасности (Security Providers), которые реализуют конкретные алгоритмы шифрования. Например, провайдер SunJCE предоставляет реализации AES, DES и других алгоритмов.
Внутри Cipher использует режимы шифрования (например, ECB, CBC, GCM) и дополнительные параметры (например, векторы инициализации).

Класс работает в трех режимах:
Шифрование (ENCRYPT_MODE).
Дешифрование (DECRYPT_MODE).
Обертывание ключей (WRAP_MODE).


Основные методы Cipher

getInstance(String transformation): Создает экземпляр Cipher для указанного алгоритма и режима (например, "AES/CBC/PKCS5Padding").
init(int opmode, Key key): Инициализирует Cipher для шифрования или дешифрования с использованием ключа.
doFinal(byte[] input): Выполняет шифрование или дешифрование данных.
update(byte[] input): Обновляет данные для пошаговой обработки (полезно для больших данных).


Пример использования Cipher
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

public class CipherExample {
public static void main(String[] args) throws Exception {
// Генерация ключа
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 128-битный ключ
SecretKey secretKey = keyGen.generateKey();

// Создание Cipher для AES
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);

// Шифрование данных
String originalText = "Hello, Java Crypto!";
byte[] encryptedBytes = cipher.doFinal(originalText.getBytes());
System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encryptedBytes));

// Дешифрование данных
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
System.out.println("Decrypted: " + new String(decryptedBytes));
}
}


Плюсы и минусы Cipher

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


Минусы
Требует правильной настройки параметров (например, режима и вектора инициализации).
Может быть сложным для новичков.


2. Класс KeyGenerator (генерация симметричных ключей)
Класс KeyGenerator используется для генерации симметричных ключей, которые применяются в алгоритмах шифрования, таких как AES, DES и других.

Как работает KeyGenerator под капотом?
KeyGenerator использует криптографически безопасные генераторы случайных чисел (CSPRNG) для создания ключей.
Размер ключа зависит от алгоритма (например, 128, 192 или 256 бит для AES).

Основные методы KeyGenerator

getInstance(String algorithm): Создает экземпляр KeyGenerator для указанного алгоритма (например, "AES").
init(int keysize): Устанавливает размер ключа.
generateKey(): Генерирует симметричный ключ.


Пример использования KeyGenerator
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

public class KeyGeneratorExample {
public static void main(String[] args) throws Exception {
// Создание KeyGenerator для AES
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // 256-битный ключ

// Генерация ключа
SecretKey secretKey = keyGen.generateKey();
System.out.println("Generated Key: " + Base64.getEncoder().encodeToString(secretKey.getEncoded()));
}
}


Плюсы и минусы KeyGenerator

Плюсы:
Простота генерации ключей.
Поддержка различных алгоритмов.


Минусы:
Ключи должны храниться безопасно (например, в KeyStore).
Не подходит для асимметричных ключей (для этого используется KeyPairGenerator)


#Java #Training #Medium #Java_Crypto_API #Cipher #KeyGenerator
👍1
Что выведет код?

public class Task240225 {
public static void main(String[] args) {
Integer a = 1000;
int b = 1000;
Integer c = Integer.valueOf(1000);
Integer d = Integer.valueOf(1000);

System.out.println(a == b);
System.out.println(a == c);
System.out.println(c == d);
System.out.println(a.equals(d));
}
}


#Tasks
👍1
Слишком жизненно...😂 😜

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2😁1
Вопросы с собеседования 👩‍💻

Какой метод используется для получения текущей даты?
Anonymous Quiz
17%
Date.getCurrent()
12%
Calendar.getInstance()
7%
System.getDate()
👍1
Java Crypto API

Классы SecretKey и IvParameterSpec

1. Класс SecretKey (работа с симметричными ключами)
Класс SecretKey представляет собой интерфейс, который используется для работы с симметричными ключами. Он является частью Java Cryptography Architecture (JCA) и реализуется классами, предоставляемыми провайдерами безопасности (например, SecretKeySpec).

Как работает SecretKey под капотом?
SecretKey — это интерфейс, который расширяет интерфейс Key. Он предоставляет методы для получения закодированного представления ключа и информации о его алгоритме.
Реализация SecretKey (например, SecretKeySpec) хранит ключ в виде массива байт и предоставляет методы для доступа к этим данным.


Основные методы SecretKey

getEncoded(): Возвращает закодированное представление ключа в виде массива байт.
getAlgorithm(): Возвращает имя алгоритма, для которого предназначен ключ (например, "AES").
getFormat(): Возвращает формат, в котором закодирован ключ (например, "RAW").


Пример использования SecretKey
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

public class SecretKeyExample {
public static void main(String[] args) throws Exception {
// Генерация ключа с помощью KeyGenerator
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 128-битный ключ
SecretKey secretKey = keyGen.generateKey();

// Получение закодированного ключа
byte[] keyBytes = secretKey.getEncoded();
System.out.println("Key (Base64): " + Base64.getEncoder().encodeToString(keyBytes));

// Получение информации о ключе
System.out.println("Algorithm: " + secretKey.getAlgorithm());
System.out.println("Format: " + secretKey.getFormat());
}
}


Плюсы и минусы SecretKey

Плюсы:
Универсальный интерфейс для работы с симметричными ключами.
Поддерживает различные алгоритмы шифрования.


Минусы:
Ключи должны храниться безопасно (например, в KeyStore).
Не подходит для асимметричных ключей.


2. Класс IvParameterSpec (векторы инициализации)
Класс IvParameterSpec используется для работы с векторами инициализации (IV), которые необходимы для некоторых режимов шифрования, таких как CBC (Cipher Block Chaining) или GCM (Galois/Counter Mode).

Как работает IvParameterSpec под капотом?
Вектор инициализации (IV) — это случайное значение, которое используется для обеспечения уникальности шифрования даже при использовании одного и того же ключа.
IvParameterSpec — это простая обертка вокруг массива байт, представляющего IV.


#Java #Training #Medium #Java_Crypto_API #SecretKey #IvParameterSpec
👍1
Основные методы IvParameterSpec

IvParameterSpec(byte[] iv): Создает объект IvParameterSpec с указанным вектором инициализации.
getIV(): Возвращает вектор инициализации в виде массива байт.


Пример использования IvParameterSpec

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.security.SecureRandom;
import java.util.Base64;

public class IvParameterSpecExample {
public static void main(String[] args) throws Exception {
// Генерация ключа
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 128-битный ключ
SecretKey secretKey = keyGen.generateKey();

// Генерация вектора инициализации
byte[] iv = new byte[16]; // 16 байт для AES
SecureRandom random = new SecureRandom();
random.nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);

// Шифрование с использованием IV
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);

String originalText = "Hello, Java Crypto!";
byte[] encryptedBytes = cipher.doFinal(originalText.getBytes());
System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encryptedBytes));

// Дешифрование с использованием IV
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
System.out.println("Decrypted: " + new String(decryptedBytes));
}
}


Плюсы и минусы IvParameterSpec

Плюсы:
Обеспечивает уникальность шифрования даже при использовании одного ключа.
Простота использования.


Минусы:
IV должен быть случайным и уникальным для каждого шифрования.
IV должен передаваться вместе с зашифрованными данными.


#Java #Training #Medium #Java_Crypto_API #SecretKey #IvParameterSpec
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
#Mems. Позитива и мотивации в ленту.
😁3💯2🥰1
📌 Факт дня:

А вы знали, что в 1971 году была изобретена электронная почта?

Но никто не знал, как сказать "@" по телефону! В итоге одни называли его "улиткой", другие "кошачьим хвостом".


Proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
📌 Цитата дня: Маргарет Гамильтон

"Программирование — это искусство предвидеть все возможные ошибки."


Гамильтон, пионер программирования и разработчик ПО для миссии "Аполлон", сказала это в интервью MIT в 2016 году.

Почитать короткую биографию
И еще немного интересного

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3