Base64 API, появившийся в Java 8
java.util.Base64 кодирует произвольные байты печатными ASCII-символами. Это не шифрование и не хеширование: любой получатель может декодировать данные.
Три варианта
| API | Алфавит и формат |
|---|---|
getEncoder() | базовый RFC-алфавит, без переводов строк |
getUrlEncoder() | URL-safe символы - и _ |
getMimeEncoder() | MIME-формат с переносами строк |
Для каждого есть соответствующий decoder.
String source = "заказ:42";
String encoded = Base64.getEncoder()
.encodeToString(source.getBytes(StandardCharsets.UTF_8));
String decoded = new String(
Base64.getDecoder().decode(encoded),
StandardCharsets.UTF_8
);Для URL-токена часто убирают padding:
String token = Base64.getUrlEncoder()
.withoutPadding()
.encodeToString(bytes);
byte[] restored = Base64.getUrlDecoder().decode(token);Ограничения
- объём увеличивается примерно на треть;
- строку всегда переводить в байты с явной кодировкой;
- decoder отвергает недопустимый ввод через
IllegalArgumentException; - Base64 не защищает пароль, персональные данные или секрет;
- basic и URL-safe алфавиты нельзя бездумно смешивать.
Для больших потоков есть обёртки encoder.wrap(OutputStream) и decoder.wrap(InputStream), чтобы не держать весь результат в памяти.
На собеседовании
Можно ли хранить пароль в Base64? Нет, это обратимое представление.
Зачем URL encoder? Он избегает + и /, неудобных в URL и именах.
Почему указывают UTF-8? Преобразование String ↔ byte[] иначе зависит от default charset.
Что такое padding =? Заполнение последнего блока; некоторые протоколы разрешают его убрать.
Связано: Работа со строковыми данными, SSL.