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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Основы криптографии

Хэш-функции (SHA-256, MD5)

Хэш-функция — это алгоритм, который принимает произвольные данные и генерирует фиксированную строку (хэш).

Основные свойства хэша:
Детерминированность – одно и то же входное значение всегда даёт одинаковый результат.
Скорость – быстрый расчёт хэша.
Устойчивость к коллизиям – два разных входных значения не должны давать одинаковый хэш.


MD5 – устаревший алгоритм
Разработан в 1991 году Рональдом Ривестом.
Размер хэша: 128 бит (32 символа в шестнадцатеричном формате).
Уязвим для атак на коллизии – можно подобрать два разных входных значения с одинаковым хэшем.
Используется только для контрольных сумм (например, проверки целостности файлов).


Как работает MD5 под капотом?

Разделяет сообщение на блоки по 512 бит.
Добавляет бит 1 в конец данных, затем дополняет нулями до 448 бит.
Добавляет 64-битное представление длины исходного сообщения.
Применяет 4 раунда нелинейных преобразований (циклические сдвиги, XOR, сложение по модулю 2³²).
Получает 128-битный хэш.


Пример MD5 в Java
import java.security.MessageDigest;

public class MD5Example {
public static void main(String[] args) throws Exception {
String input = "Hello, world!";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(input.getBytes());

StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
hexString.append(String.format("%02x", b));
}
System.out.println("MD5 Hash: " + hexString.toString());
}
}


SHA-256
Разработан NSA в 1993 году как часть SHA-2.
Размер хэша: 256 бит (64 символа в шестнадцатеричном формате).
Безопасен на 2025 год, поскольку коллизии не найдены.
Используется в блокчейне, цифровых подписях, аутентификации пользователей.


Как работает SHA-256 под капотом?

Разбивает данные на 512-битные блоки.
Добавляет padding, как в MD5.
Инициализирует 8 переменных (A–H) с фиксированными значениями.
Выполняет 64 раунда преобразований, используя битовые сдвиги, XOR и сложение по модулю 2³².
Возвращает 256-битный (32-байтовый) хэш.


Пример SHA-256 в Java
import java.security.MessageDigest;

public class SHA256Example {
public static void main(String[] args) throws Exception {
String input = "Hello, world!";
MessageDigest sha = MessageDigest.getInstance("SHA-256");
byte[] hash = sha.digest(input.getBytes());

StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
hexString.append(String.format("%02x", b));
}
System.out.println("SHA-256 Hash: " + hexString.toString());
}
}


Цифровые подписи

Цифровая подпись – это криптографическая технология, обеспечивающая:
Аутентификацию – доказывает, что данные создал именно этот отправитель.
Целостность – если данные изменятся, подпись станет недействительной.
Неотрекаемость – автор не может отрицать, что подписал документ.


Как работает цифровая подпись?

Отправитель хэширует данные (обычно SHA-256).
Этот хэш шифруется приватным ключом (RSA/ECDSA).
Подпись отправляется вместе с оригинальными данными.
Получатель проверяет подпись с помощью публичного ключа.


Пример цифровой подписи (RSA) в Java

import java.security.*;

public class DigitalSignatureExample {
public static void main(String[] args) throws Exception {
// Генерация ключей
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair pair = keyGen.generateKeyPair();

Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(pair.getPrivate());

String data = "Important message";
signature.update(data.getBytes());
byte[] signedData = signature.sign();

// Проверка подписи
signature.initVerify(pair.getPublic());
signature.update(data.getBytes());
boolean isValid = signature.verify(signedData);

System.out.println("Подпись действительна? " + isValid);
}
}


#Java #Training #Medium #Crypto #Hash #MD5 #SHA_256
Что выведет код?

class Alfa {
void print(Alfa obj) {
System.out.println("A");
}
}

class Beta extends Alfa {
void print(Beta obj) {
System.out.println("B");
}
}

public class Task210225 {
public static void main(String[] args) {
Alfa obj1 = new Beta();
Alfa obj2 = new Alfa();
obj1.print(obj2);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
28%
A
33%
B
26%
RuntimeException
13%
Ничего
А он не подходит к замку 😜

https://t.me/Java_for_beginner_dev

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

Какой метод используется для запуска потока?
Anonymous Quiz
42%
start()
46%
run()
10%
execute()
2%
launch()
Основы криптографии

Соль (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

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
Всем привет! 👋

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

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

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

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

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

А всем остальным просто замечательных выходных!
🍸
Please open Telegram to view this post
VIEW IN TELEGRAM
Встреча создана - 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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
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
Что выведет код?

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