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.