Чому стільки хешованих та зашифрованих рядків закінчуються знаком рівності?


64

Я працюю в C # і MSSQL, і, як ви очікували, я зберігаю свої паролі засоленими і хешованими.

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

Я бачив подібні речі під час роботи з алгоритмами шифрування, це збіг обставин чи є в цьому причина?


19
Крім того, якщо ви зберігаєте кодовані двома даними дані в полі 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 кодувати її. )
Брайан S

2
@WillieWheeler Я думаю, ти не вистачаєш точки. Перечитайте те, що написав Браян S - він не говорив про властивості base64 для хешування - це було б абсурдно base64 - це не алгоритм хешування. Він каже, що немає нічого поганого в тому, щоб зберігати хеш (створений функцією / алгоритмом хешу) у формі6464.
Андрій Савіних

3
ОП каже, що він зберігає хеш і він закінчується знаками рівності. Це говорить про те, що він плутає хешування з кодуванням Base64. Якщо справа в тому, що нормально base64 кодувати хеш, то, звичайно, але що це стосується нічого?
Віллі Вілер

2
Так, я нарешті зрозумів, що відбувається. Я переглянув свої SSH-файли із відкритими та приватними ключами та помітив, що вони також мають закінчення = / ==. Це базові кодування байтових масивів, як, наприклад, 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.