Как получить шестнадцатеричный хеш с помощью функции crypt ()?

Если я создаю SHA-256 в терминале, я получаю красивый шестнадцатеричный хеш:

echo -n ChillyWilly | sha256sum
4c74e3994a247dfc31a515721528c78bb6ec09ccdcfd894d09f4aa44131393a8  -

Если я попытаюсь сделать то же самое с функцией crypt (3), я получу что-то совершенно другое:

const char* what = crypt("ChillyWilly", "$5$");
printf("%s
", what);
$5$$fQITOGYPwBrwOSpjX1Uhx5Ock/J84zbrqmTtg/SlvMB

Похоже на Base64, но это не так.

Я предполагаю, что если ключ и соль равны, то я должен получить тот же результат. Все хэши SHA-256 в сети сгенерируют одинаковый результат из одной и той же комбинации ключ / соль.

Как я могу получить тот же шестнадцатеричный хеш с функцией crypt (3)? Я установил $ 5 $, как указано на man-странице crypt, которая должна перевести функцию crypt в режим SHA-256.

Я знаю, что здесь есть несколько похожих вопросов, но они не содержат правильных ответов.

Благодарность!

Всего 2 ответа


crypt() самом деле crypt() будет использовать тот же алгоритм SHA-256 - но он не возвращает хеш, как вы ожидаете. После вычисления хеша он применяет другое преобразование к результату, как показано здесь .

Так что я бы не рассчитывал использовать его и получать тот же результат, что и sha256sum , поскольку он создан для другой цели . Возможно, вы захотите использовать реализацию openssl SHA256 или что-то еще, если вам это нужно.


Хотя crypt может использовать SHA-256 в режиме $5$ , это не одно и то же.

SHA-256 - это хеш-функция, разработанная для быстрого запуска. Но crypt - это функция получения ключей, предназначенная для хеширования паролей. Таким образом, он запускает SHA-256 большое количество раз (по умолчанию 5000), чтобы сделать его медленнее и менее подверженным атакам методом перебора. Так что это даст другой результат, чем простое использование SHA-256. Вы можете увидеть детали алгоритма здесь .

Как вы видели, crypt также выводит результат не в шестнадцатеричном виде, а в виде Base64-подобной кодировки (не стандартной Base64, но основанной на аналогичной идее). Нет смысла пытаться преобразовать в гекс, если вы делаете это, ожидая получить тот же результат, что и SHA-256.


Есть идеи?

10000