Диапазон допустимых символов для кодировки base 64

Меня интересует следующее:
Существует ли список символов, которые никогда не встречаются в строке, закодированной с основанием 64?
Например, *. Я не уверен, произойдет это или нет. Если бы исходный ввод действительно имел * как часть, это было бы закодировано по-другому?


person Jim    schedule 02.11.2012    source источник
comment
Я бы посмотрел на эту страницу, чтобы решить это. en.wikipedia.org/wiki/Base64   -  person Peter Lawrey    schedule 02.11.2012
comment
Представление о том, что * на входе будет представлено как * на выходе, является странным и указывает на серьезную концептуальную путаницу в отношении отношения ввода к выводу. * может появиться на выходе тогда и только тогда, когда он является членом набора символов base 64 ... независимо от того, что находится на входе.   -  person Jim Balter    schedule 07.06.2018


Ответы (4)


Вот что мне удалось обнаружить: RFC 4648.

Он включает в себя эту удобную таблицу:

                  Table 1: The Base 64 Alphabet

 Value Encoding  Value Encoding  Value Encoding  Value Encoding
     0 A            17 R            34 i            51 z
     1 B            18 S            35 j            52 0
     2 C            19 T            36 k            53 1
     3 D            20 U            37 l            54 2
     4 E            21 V            38 m            55 3
     5 F            22 W            39 n            56 4
     6 G            23 X            40 o            57 5
     7 H            24 Y            41 p            58 6
     8 I            25 Z            42 q            59 7
     9 J            26 a            43 r            60 8
    10 K            27 b            44 s            61 9
    11 L            28 c            45 t            62 +
    12 M            29 d            46 u            63 /
    13 N            30 e            47 v
    14 O            31 f            48 w         (pad) =
    15 P            32 g            49 x
    16 Q            33 h            50 y

Таким образом, регулярное выражение, соответствующее любому символу, который никогда не должен появляться в кодировках Base 64, будет выглядеть так:

[^A-Za-z0-9+/=]

Однако, как указывает ответ kapeps, это всего лишь рекомендация. Конкретные реализации могут выбрать другой набор из 64 символов. (На самом деле, даже связанный RFC содержит альтернативную таблицу для безопасного кодирования URL и имени файла, в которой символы 62 и 63 заменены на - и _ соответственно). Так что я думаю, это действительно зависит от реализации, которая создала кодировку.

person Martin Ender    schedule 02.11.2012
comment
/ являясь частью стандарта, означает, что это нельзя использовать для именования файлов. Кроме того, почему бы не начать с 0 перед A? Зачем намеренно делать первые десять чисел в базовой системе разными? - person Aaron Franke; 03.01.2019
comment
Я не могу ответить на ваш второй вопрос, но RFC предоставляет альтернативную кодировку, которая не использует / и + и специально разработана для обеспечения безопасности имен файлов и URL-адресов. - person Martin Ender; 03.01.2019
comment
@MartinEnder Кстати, более подходящим регулярным выражением было бы ^[A-Za-z0-9+/]+={0,2}$. - person Victor; 18.05.2019
comment
Есть ли какая-нибудь функция python, которая может вернуть значение кодировки? например, что-то вроде base64('A') = 0, base64('O') = 14 - person Praveen Parihar; 10.09.2019

Вы, вероятно, в безопасности с другими ответами в большинстве ситуаций, но согласно статье Википедии о Base64 не должно быть определенного списка, на который можно положиться:

Конкретный выбор набора символов, выбранного для 64 символов, необходимых для базы, зависит от реализации.

RFC 4648 упоминает другие алфавиты, такие как "URL и безопасное имя файла. " Базовый алфавит 64, где + и / заменены на - и _.

Существует таблица вариантов Base64, в которых используются разные символы. Имейте в виду, что существуют специальные правила реализации разделителей строк, которые вы можете найти в той же таблице. Некоторые реализации, такие как Mime, даже допускают (и игнорируют) символы, которых нет в алфавите.

person kapex    schedule 02.11.2012

Base64 содержит только A–Z, a–z, 0–9, +, / и =. Таким образом, список символов, которые нельзя использовать, таков: все возможные символы за вычетом упомянутых выше.

Для специальных целей также возможны . и _.

person jlordo    schedule 02.11.2012

https://en.wikipedia.org/wiki/Base64#Design

Реализация MIME Base64 использует A–Z, a–z и 0–9 для первых 62 значений.

Поэтому по большей части вы должны ожидать только буквенно-цифровые символы. Пример таблицы в этой статье также показывает «+» и «-»; маловероятно, что вы увидите '*'.

Вы можете использовать http://www.motobit.com/util/base64-decoder-encoder.asp для преобразования, например, в Base64, а для '*' возвращается "Kg=="

person robert    schedule 02.11.2012