Если вы занимаетесь веб-разработкой, разработкой данных или кибербезопасностью, возможно, вы слышали о Base64. Если вы видели примеры текста в формате Base64, это похоже на тарабарщину. Вы могли спросить себя: «Что это?» И, что более важно, «Для чего это используется?» Поиск в Google ответа дает высокотехнологичные объяснения с использованием radix-64 и RFC 4648. Если вы ищете упрощенное объяснение, вы попали в нужное место.

Что такое Base64?

Base64 - это часто используемый и надежный метод представления произвольных двоичных данных в виде текста. Название происходит от того факта, что Base64 использует 64 возможных значения для представления двоичных данных. Это означает, что существует шесть битов для представления одного символа Base64 (2⁶ = 64). Значения состоят из прописных и строчных букв, цифр от 0 до 9, а также знаков «+» и «/». Но как преобразовать биты в Base64? Понимание того, как это делается, требует некоторого объяснения того, как представлены двоичные данные.

В качестве примера возьмем слово один и то, как его можно представить как Base64. Однако, прежде чем мы это сделаем, давайте обсудим ASCII. ASCII - это схема кодирования для представления текстовых данных в компьютерной системе. ASCII представляет символы с восемью битами (всего 2⁸ = 256 возможных значений), поэтому слово в кодировке ASCII один представляется как:

  "o"        "n"        "e"
01101111   01101110   01100101

Преобразование каждого символа в его восьмибитное двоичное представление определяется таблицей ASCII. Base64 кодирует двоичные данные шестью битами вместо восьми в соответствии со значениями в этой поисковой таблице Base64. Разделив двоичное представление ASCII слова один на шесть битовых блоков и используя поисковую таблицу Base64, мы можем получить представление Base64 слова ASCII один как b25l.

   "o"        "n"        "e"
 01101111   01101110   01100101
 011011  110110  111001  100101
   "b"     "2"     "5"     "l"

Для чего используется Base64?

Есть несколько причин, по которым вы можете захотеть закодировать двоичные данные в Base64, некоторые хорошие, а некоторые не очень. Самый распространенный случай - отправка двоичных данных по HTTP. Чтобы предотвратить повреждение данных, вы можете кодировать в Base64 изображения, аудио и другие двоичные форматы файлов, чтобы отправлять данные как часть HTTP-запроса GET или HTML-формы. Примером этого является загрузка вашего резюме в формате PDF на веб-сайт работодателя. Вы также можете кодировать компьютерный код Base64 для передачи по HTTP. MermaidJS делает это для обмена блок-схемами и диаграммами.

Другой установленный вариант использования Base64 - это вложения электронной почты. Файлы, прикрепленные к электронному письму, закодированы в Base64 за кулисами, прежде чем они будут переданы вместе с электронным письмом по почтовому протоколу SMTP.

Base64 также используется для обфускации данных или их маскировки, чтобы они не были удобочитаемы. Это часто делается для передачи полусекретной информации, такой как уникальные идентификаторы или полезные данные JSON, по HTTP. Однако злоумышленники часто используют кодировку Base64, чтобы скрыть вредоносные программы или вредоносные URL-адреса в макросах и скриптах Excel от антивирусного программного обеспечения. По этой причине вы всегда должны с подозрением относиться к запуску скриптов и макросов, которые вы загружаете или отправляете вам по электронной почте, которые не из надежного источника.

Base64 - это то же самое, что и шифрование?

Короче нет. Внешне кажется, что для шифрования данных можно использовать кодировку Base64, однако кодировка Base64 только преобразует данные в текстовый формат. При декодировании Base64 не используется шифр, и в этом процессе не используется случайность. Следовательно, любые данные в кодировке Base64 могут быть легко декодированы кем-то другим.

По этой причине кодировка Base64 не заменяет безопасность. Если вам нужно убедиться, что передаваемые данные не будут прочитаны ненадежной стороной, вам нужно будет зашифровать данные. Если вы просто хотите убедиться, что передаваемые данные не были подделаны ненадежной стороной, вам потребуется криптографически подписать данные. Обе эти темы выходят за рамки этого обсуждения, но я настоятельно рекомендую вам узнать больше о шифровании данных.

Как мне кодировать и декодировать данные Base64?

Если вам нужно кодировать текст или содержимое файла в формате Base64 в качестве одноразового использования, вы можете посетить www.base64encode.org, который является бесплатным и простым в использовании. Существует также дочерний сайт www.base64decode.org для декодирования Base64.

Если вам нужно регулярно кодировать и декодировать данные Base64, несколько языков программирования имеют встроенную поддержку Base64. В Go вы можете использовать следующий код для кодирования строки Base64:

package main
import (
    "encoding/base64"
    "fmt"
)
func main() {
    msg := "Hello world!"
    encoded := base64.StdEncoding.EncodeToString([]byte(msg)
    fmt.Println(encoded)
}

В Python эквивалентный код можно использовать для кодирования строки Base64:

import base64
msg = "Hello world!"
encoded = base64.b64encode(bytes(msg, encoding='utf-8'))
print(encoded.decode('utf-8'))

Оба набора кода преследуют одну и ту же цель - они принимают строку «Hello world!» поскольку msg и Base64 кодируют его с использованием кодировки utf-8 (utf-8 неявно используется в Go, где он явно определен в Python). Обе функции кодирования Base64 работают с двоичными данными - массивом байтов в Go и объектом байтов в Python. Поскольку msg является строкой, она приводится к соответствующему типу и сохраняется в переменной encoded. Результат печати encoded: «SGVsbG8gd29ybGQh».

Расшифровка текста из Base64 очень похожа:

package main
import (
    "encoding/base64"
    "fmt"
)
func main() {
    msg := "SGVsbG8gd29ybGQh"
    decoded, err := base64.StdEncoding.DecodeString(msg)
    if err != nil {
        fmt.Println("error:", err)
        return
    }
    fmt.Printf("%q\n", decoded)
}

В Python эквивалентный код можно использовать для декодирования строки Base64:

import base64
msg = bytes("SGVsbG8gd29ybGQh", encoding='utf-8')
decoded = base64.b64decode(msg)
print(decoded.decode('utf-8'))

Оба набора кода принимают строку «SGVsbG8gd29ybGQh», и Base64 декодирует ее. Base64 работает с двоичными данными, поэтому, хотя функция Go DecodeString принимает строку, она возвращает decoded в виде байтового массива - таким образом, команда форматирования %q для печати decoded. Код Python аналогичным образом должен преобразовать decoded из байтового объекта в строковый объект с помощью метода decode().

Заключение

Мы узнали, что такое Base64, для чего он используется и как реализовать кодировщик и декодер Base64 в Go и Python. Однако это только верхушка Base64, и многое еще предстоит открыть. Надеюсь, теперь у вас будет лучшее представление о том, как включить Base64 в свой следующий проект. Удачного взлома!