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-коды:
Переводим в двоичный вид (каждый символ занимает 8 бит):
Разбиваем на 6-битные блоки (24 бита → 4 группы по 6 бит):
Соотносим с таблицей Base64:
Если входные данные не кратны 3 байтам, добавляются =:
Base64 в Java
Java предоставляет встроенный класс Base64 в пакете java.util, начиная с Java 8.
Кодирование строки в Base64
Вывод:
Декодирование Base64
Вывод:
Варианты Base64 в Java
В Java есть три основных варианта Base64:
1. Base64.getEncoder() и Base64.getDecoder() (обычная версия)
Использует стандартный алфавит A-Z, a-z, 0-9, +, / и =.
Пример:
2. Base64.getUrlEncoder() и Base64.getUrlDecoder() (для URL)
Использует безопасный для URL алфавит A-Z, a-z, 0-9, -, _ (заменяет + на - и / на _, убирает =).
Пример:
3. Base64.getMimeEncoder() и Base64.getMimeDecoder() (для MIME)
Форматирует выходные данные в 76-символьные строки, разделенные \r\n, подходит для шифрования PGP, email-передачи.
Пример:
#Java #Training #Medium #Java_Crypto_API #Base64
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
Где применяется Base64
Передача бинарных данных в текстовом формате
Встраивание изображений в HTML и CSS:
Кодирование бинарных данных в JSON
Шифрование и подписи в криптографии
Используется для кодирования RSA-ключей, хэшей, токенов JWT
Пример работы с шифрованием AES:
HTTP-заголовки и авторизация
Basic Auth:
Передача данных по email (MIME)
Base64 используется в email-кодировании, Content-Transfer-Encoding: base64
Сериализация бинарных данных
Применяется для кодирования файлов в JSON, передаваемых через API.
Ограничения и недостатки
Увеличение размера
Base64 увеличивает размер данных на ~33% (3 байта → 4 символа).
Не защищает данные
Base64 — это не шифрование и не хэширование. Оно только преобразует данные в строковый вид, но не защищает их.
Обратимость
Закодированные данные легко декодируются, поэтому Base64 не подходит для хранения паролей.
#Java #Training #Medium #Java_Crypto_API #Base64
Передача бинарных данных в текстовом формате
Встраивание изображений в HTML и CSS:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />
Кодирование бинарных данных в JSON
Шифрование и подписи в криптографии
Используется для кодирования RSA-ключей, хэшей, токенов JWT
Пример работы с шифрованием AES:
byte[] encryptedData = encryptAES("Hello".getBytes(), secretKey);
String base64Encoded = Base64.getEncoder().encodeToString(encryptedData);
HTTP-заголовки и авторизация
Basic Auth:
String auth = "user:password";
String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes());
String header = "Authorization: Basic " + encodedAuth;
Передача данных по email (MIME)
Base64 используется в email-кодировании, Content-Transfer-Encoding: base64
Сериализация бинарных данных
Применяется для кодирования файлов в JSON, передаваемых через API.
Ограничения и недостатки
Увеличение размера
Base64 увеличивает размер данных на ~33% (3 байта → 4 символа).
Не защищает данные
Base64 — это не шифрование и не хэширование. Оно только преобразует данные в строковый вид, но не защищает их.
Обратимость
Закодированные данные легко декодируются, поэтому Base64 не подходит для хранения паролей.
#Java #Training #Medium #Java_Crypto_API #Base64