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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Слишком жизненно...😂 😜

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
Java Crypto API

Классы KeyPairGenerator и KeyPair

Класс KeyPairGenerator (генерация асимметричных ключей)

Класс KeyPairGenerator используется для генерации пары асимметричных ключей: открытого (public key) и закрытого (private key). Эти ключи применяются в асимметричных алгоритмах, таких как RSA, DSA и ECDSA.

Как работает KeyPairGenerator под капотом?
KeyPairGenerator использует криптографически безопасные генераторы случайных чисел (CSPRNG) для создания ключей.
Внутри он генерирует два связанных ключа: открытый (для шифрования или проверки подписи) и закрытый (для дешифрования или создания подписи).
Размер ключа зависит от алгоритма (например, 2048 или 4096 бит для RSA).


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

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


Пример использования KeyPairGenerator
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.util.Base64;

public class KeyPairGeneratorExample {
public static void main(String[] args) throws Exception {
// Создание KeyPairGenerator для RSA
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048); // 2048-битный ключ

// Генерация пары ключей
KeyPair keyPair = keyPairGen.generateKeyPair();

// Получение открытого и закрытого ключей
byte[] publicKey = keyPair.getPublic().getEncoded();
byte[] privateKey = keyPair.getPrivate().getEncoded();

System.out.println("Public Key (Base64): " + Base64.getEncoder().encodeToString(publicKey));
System.out.println("Private Key (Base64): " + Base64.getEncoder().encodeToString(privateKey));
}
}


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

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


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


Класс KeyPair (работа с асимметричными ключами)

Класс KeyPair представляет собой контейнер для пары асимметричных ключей: открытого и закрытого. Он используется вместе с KeyPairGenerator и другими классами, такими как Signature и Cipher.

Как работает KeyPair под капотом?
KeyPair содержит два объекта: PublicKey и PrivateKey.
Эти ключи используются в асимметричных операциях, таких как шифрование/дешифрование или создание/проверка цифровых подписей.

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

getPublic(): Возвращает открытый ключ.
getPrivate(): Возвращает закрытый ключ.

Пример использования KeyPair
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

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

// Получение открытого и закрытого ключей
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();

System.out.println("Public Key Algorithm: " + publicKey.getAlgorithm());
System.out.println("Private Key Format: " + privateKey.getFormat());
}
}


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

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


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


#Java #Training #Medium #Java_Crypto_API #KeyPairGenerator #KeyPair
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
айтишник отказался от зарплаты в 950 тысяч рублей, потому что… ЖЕНА БЫ НЕ ПОНЯЛА зарплату меньше миллиона.

https://t.me/Java_for_beginner_dev

#Mems
👍3🤔1
Что выведет код?

public class Task250225 {
public static void main(String[] args) {
byte b = (byte) 200;
int i = b + 100;
double d = (double) i / 300;

System.out.println(b);
System.out.println(i);
System.out.println(d);
}
}


#Tasks
👍2
Все сеньоры когда-то были джунами...😂 🤣

https://t.me/Java_for_beginner_dev

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

Класс Signature (цифровые подписи)

Класс Signature используется для создания и проверки цифровых подписей. Цифровая подпись обеспечивает целостность данных и аутентификацию отправителя.

Как работает Signature под капотом?
Signature использует асимметричные алгоритмы (например, RSA, DSA, ECDSA) для создания и проверки подписей.

Процесс состоит из двух этапов:
Создание подписи: Закрытый ключ используется для создания подписи.
Проверка подписи: Открытый ключ используется для проверки подписи.


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

getInstance(String algorithm): Создает экземпляр Signature для указанного алгоритма (например, "SHA256withRSA").
initSign(PrivateKey privateKey): Инициализирует объект для создания подписи с использованием закрытого ключа.
initVerify(PublicKey publicKey): Инициализирует объект для проверки подписи с использованием открытого ключа.
update(byte[] data): Обновляет данные для подписи или проверки.

sign(): Создает подпись.
verify(byte[] signature): Проверяет подпись.


Пример использования Signature
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;

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

// Получение ключей
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();

// Создание подписи
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
String data = "Hello, Java Crypto!";
signature.update(data.getBytes());
byte[] digitalSignature = signature.sign();
System.out.println("Digital Signature (Base64): " + Base64.getEncoder().encodeToString(digitalSignature));

// Проверка подписи
signature.initVerify(publicKey);
signature.update(data.getBytes());
boolean isVerified = signature.verify(digitalSignature);
System.out.println("Signature Verified: " + isVerified);
}
}


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

Плюсы:
Обеспечивает целостность данных и аутентификацию.
Поддерживает различные алгоритмы (RSA, DSA, ECDSA).


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



Класс MessageDigest (хэш-функции)

Класс MessageDigest используется для вычисления хэш-значений данных. Хэш-функции применяются для обеспечения целостности данных и создания уникальных идентификаторов.

Как работает MessageDigest под капотом?
MessageDigest использует криптографические хэш-функции (например, SHA-256, MD5) для преобразования данных в фиксированный размер хэш-значения.
Хэш-функции являются односторонними: из хэша нельзя восстановить исходные данные.

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

getInstance(String algorithm): Создает экземпляр MessageDigest для указанного алгоритма (например, "SHA-256").
update(byte[] input): Обновляет данные для хэширования.
digest(): Вычисляет хэш-значение.
digest(byte[] input): Вычисляет хэш-значение для указанных данных.


Пример использования MessageDigest
import java.security.MessageDigest;
import java.util.Base64;

public class MessageDigestExample {
public static void main(String[] args) throws Exception {
// Создание MessageDigest для SHA-256
MessageDigest digest = MessageDigest.getInstance("SHA-256");

// Хэширование данных
String data = "Hello, Java Crypto!";
byte[] hash = digest.digest(data.getBytes());

// Вывод хэша в Base64
System.out.println("Hash (Base64): " + Base64.getEncoder().encodeToString(hash));
}
}


#Java #Training #Medium #Java_Crypto_API #Signature #MessageDigest
👍2
Плюсы и минусы MessageDigest

Плюсы:

Обеспечивает целостность данных.
Поддерживает различные алгоритмы (SHA-256, MD5, SHA-1).


Минусы:

Хэш-функции устаревают (например, MD5 и SHA-1 считаются небезопасными).
Не подходит для шифрования данных.


#Java #Training #Medium #Java_Crypto_API #Signature #MessageDigest
👍1
#Mems. Все мы немного этот котик
💯3
📌 Факт дня:

А вы знали, что самая длинная клавиатурная комбинация в истории была в игре "The Simpsons: Hit & Run"?

Для входа в режим отладки игроку нужно было нажать F1 + F2 + F3 + F4 + Enter + V + Insert + Right Shift + Right Ctrl + Delete + End + Page Down. Попробуйте повторить!


Пруфа нет 🤪

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔2👍1
📌 Цитата дня: Ада Лавлейс

"Машина может делать всё, что можно выразить математически."


Лавлейс написала это в своих заметках к работе Чарльза Бэббиджа в 1843 году. Она считается одним из первых программистов.

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

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Все знают, что он существует, но лично никто не видел...

https://t.me/Java_for_beginner_dev

#Mems
😁1
Base64 в Java Crypto API

Base64 — это алгоритм кодирования двоичных данных в текстовый формат с использованием 64 символов ASCII. Он используется для представления бинарных данных в виде строк, удобных для передачи по сетевым протоколам и хранения в текстовых форматах. В Java Crypto API Base64 часто применяется для кодирования криптографических ключей, сертификатов и других бинарных данных.

Как работает Base64

Base64 берет 3 байта (24 бита) входных данных и преобразует их в 4 символа из 64-символьного алфавита.

Алфавит Base64 включает:
Латинские буквы: A-Z и a-z (52 символа)
Цифры: 0-9 (10 символов)
Два специальных символа: + и / (или - и _ в URL-совместимой версии)
Заполнитель = (если входные данные не кратны 3 байтам)


Пример кодирования
Допустим, у нас есть строка "Man":

Преобразуем в ASCII-коды:
M = 77, a = 97, n = 110


Переводим в двоичный вид (каждый символ занимает 8 бит):
M     a     n
01001101 01100001 01101110


Разбиваем на 6-битные блоки (24 бита → 4 группы по 6 бит):
010011 010110 000101 101110


Соотносим с таблицей Base64:
010011 → T
010110 → W
000101 → F
101110 → u
Результат кодирования: "TWFu"


Если входные данные не кратны 3 байтам, добавляются =:
"Ma" (2 байта) → TWE=
"M" (1 байт) → TQ==


Base64 в Java


Java предоставляет встроенный класс Base64 в пакете java.util, начиная с Java 8.

Кодирование строки в Base64
import java.util.Base64;

public class Base64Example {
public static void main(String[] args) {
String originalString = "Hello, Java Crypto API!";
String encodedString = Base64.getEncoder().encodeToString(originalString.getBytes());
System.out.println("Encoded: " + encodedString);
}
}


Вывод:
Encoded: SGVsbG8sIEphdmEgQ3J5cHRvIEFQISTCoA==


Декодирование Base64

import java.util.Base64;

public class Base64DecodeExample {
public static void main(String[] args) {
String encodedString = "SGVsbG8sIEphdmEgQ3J5cHRvIEFQISTCoA==";
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);
System.out.println("Decoded: " + decodedString);
}
}


Вывод:
Decoded: Hello, Java Crypto API!


Варианты Base64 в Java

В Java есть три основных варианта Base64:

1. Base64.getEncoder() и Base64.getDecoder() (обычная версия)
Использует стандартный алфавит A-Z, a-z, 0-9, +, / и =.

Пример:
Base64.Encoder encoder = Base64.getEncoder();
Base64.Decoder decoder = Base64.getDecoder();

String encoded = encoder.encodeToString("Test".getBytes());
String decoded = new String(decoder.decode(encoded));

System.out.println("Encoded: " + encoded);
System.out.println("Decoded: " + decoded);


2. Base64.getUrlEncoder() и Base64.getUrlDecoder() (для URL)
Использует безопасный для URL алфавит A-Z, a-z, 0-9, -, _ (заменяет + на - и / на _, убирает =).

Пример:
Base64.Encoder urlEncoder = Base64.getUrlEncoder();
Base64.Decoder urlDecoder = Base64.getUrlDecoder();

String encoded = urlEncoder.encodeToString("https://example.com".getBytes());
String decoded = new String(urlDecoder.decode(encoded));

System.out.println("Encoded URL: " + encoded);
System.out.println("Decoded URL: " + decoded);


3. Base64.getMimeEncoder() и Base64.getMimeDecoder() (для MIME)
Форматирует выходные данные в 76-символьные строки, разделенные \r\n, подходит для шифрования PGP, email-передачи.

Пример:
Base64.Encoder mimeEncoder = Base64.getMimeEncoder();
Base64.Decoder mimeDecoder = Base64.getMimeDecoder();

String encoded = mimeEncoder.encodeToString("Example MIME data".getBytes());
String decoded = new String(mimeDecoder.decode(encoded));

System.out.println("Encoded MIME: " + encoded);
System.out.println("Decoded MIME: " + decoded);


#Java #Training #Medium #Java_Crypto_API #Base64
👍1🫡1