Почему base64 хэш sha1 / sha256? - PullRequest
       49

Почему base64 хэш sha1 / sha256?

8 голосов
/ 12 марта 2012

Кто-нибудь может мне сказать, почему amazon хочет base64 хэша hmac-sha1 / sha256?

http://docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuide/HMACAuth.html

Я знаю, что base64 представляет двоичную дату в ascii, но sha1 / sha256 уже является ascii - я имею в виду только его шестнадцатеричный код.

Спасибо

Timo

Ответы [ 2 ]

18 голосов
/ 12 марта 2012

Эти хеши не являются ASCII - причина, по которой вы видите шестнадцатеричные цифры, заключается в том, что программное обеспечение, которое вы используете для их генерации, берет двоичный вывод дайджеста и превращает его в строку шестнадцатеричных цифр ASCII.

Например, дайджест MD5 заполнит массив из 16 байтов. Вы также можете представить его как строку из 32 символов, но самой основной формой дайджеста по-прежнему является массив байтов.

Когда вы изменяете массив байтов в шестнадцатеричную строку, вам нужно 8 бит (один полный символ) для представления каждых 4 бит данных. Хотя это не так часто называют, вы могли бы сказать, что в нем используется кодировка «base16», поскольку вы захватываете 4 бита за раз и сопоставляете их с 16-символьным алфавитом.

Base64, с другой стороны, захватывает 6 битов за раз и отображает их в алфавит из 64 символов. Это означает, что вам нужно 8 битов (опять же, один полный символ) для представления каждых 6 битов данных, у которых есть половина потерянных битов base16. Строка в кодировке base16 всегда будет в два раза больше оригинала; строка в кодировке base64 будет иметь размер только четыре трети. Для хэша SHA256 base16 делает 64 байта, но base64 делает приблизительно 43.

5 голосов
/ 12 марта 2012

Например, приведенные ниже примеры байтов, шестнадцатеричных и base64 кодируют одинаковые байты:

  • байтов: 243 48 133 140 73 157 28 136 11 29 189 101 194 101 116 64 172 227 220 78
  • hex: f330858c499d1c880b1dbd65c2657440ace3dc4e
  • base64: 8zCFjEmdHIgLHb1lwmV0QKzj3E4=.

Только для AWS требуется, чтобы его значения были закодированы в base64.

...