Почему так много хешированных и зашифрованных строк заканчиваются знаком равенства?


64

Я работаю в C # и MSSQL, и, как и следовало ожидать, я храню свои пароли как соленые и хэшированные

Когда я смотрю на хеш, хранящийся в столбце nvarchar (например, из провайдера членства aspnet). Мне всегда было любопытно, почему сгенерированные значения Salt и Hash всегда заканчиваются одним или двумя знаками равенства.

Я видел подобные вещи при работе с алгоритмами шифрования, это совпадение или есть причина для этого?


19
Кроме того, если вы храните двоичные данные в кодировке Base64 в поле NVARCHAR, я оплакиваю ваши 6-кратные потери памяти! Например, Base64 может содержать только 64 символа в нижней половине ASCII (поэтому вам нужно только VARCHAR, чтобы сохранить половину). Для двоих Base64 разбивает каждый байт данных на 1-4 символа. SQL Server уже имеет тип VARBINARY, который вполне способен хранить ваши хэши без раздувания от кодирования и не заботится о сопоставлении при его сравнении ... :-)
jimbobmcgee

3
@WillieWheeler, хэш должен быть как-то сохранен. Base64 может быть не идеальным носителем данных, но в этом нет ничего плохого. Если создается hash("my password")массив, [1,2,3,4,5]и мне нужно сохранить эти значения в базе данных, есть худшие варианты, чем хранить строку AQIDBAU=(Конечно, если используемая хеш-функция уже генерирует строку, кажется немного глупым потом кодировать ее Base64. )
Брайан С.

2
@WillieWheeler Я думаю, вы упускаете суть. Перечитайте то, что написал Брайан С. Он не говорил о свойствах base64 для хеширования - это было бы абсурдно. Base64 не является алгоритмом хеширования. Он говорит, что нет ничего плохого в хранении хеша (созданного хеш-функцией / алгоритмом) в форме base64.
Андрей Савиных

3
ОП говорит, что он хранит хеш, и он заканчивается знаками равенства. Это говорит о том, что он путает хеширование с кодировкой Base64. Если дело в том, что base64 хорошо кодирует хеш, то, конечно, но какое это имеет отношение к чему-либо?
Вилли Уилер

2
Да, я наконец понял, что происходит. Я посмотрел в своих файлах открытого и закрытого ключей SSH и заметил, что они также имеют окончания = / ==. Это base64-кодирование байтовых массивов, как описывают BrianS и zespri. Спасибо, парни.
Вилли Уилер

Ответы:


95

Эти хэшированные строки (обычно?) Кодируются в формате Base64, а знак равенства используется для заполнения строки, чтобы сделать длину (число байтов) делимой на три. Википедия объясняет это довольно хорошо: http://en.wikipedia.org/wiki/Base64 .


36

Может ли это быть дополнение кодировки Base 64?

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

http://en.wikipedia.org/wiki/Base64#Output_padding

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.