Как получить hex ha sh с помощью функции crypt ()? - PullRequest
2 голосов
/ 11 февраля 2020

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

echo -n ChillyWilly | sha256sum
4c74e3994a247dfc31a515721528c78bb6ec09ccdcfd894d09f4aa44131393a8  -

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

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

Это выглядит как Base64, но это не так.

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

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

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

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

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

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

1 голос
/ 12 февраля 2020

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

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

...