Как хэш пароля закодирован в файле теневого пароля?

11

Я изучаю безопасность паролей Linux (больше любопытства, чем что-либо полезное) и понимаю, что настоящий пароль хэшируется и сохраняется в файле теневых паролей. В чем я не уверен и не смог найти в моем кратком поиске по Google, так это то, что кодирование используется для кодирования хешированного значения (и значения соли). Это, очевидно, не шестнадцатеричное, и это, очевидно, текст, за исключением :символа. Может кто-нибудь здесь сказать мне, что это за кодировка?

Редактировать: я понимаю хеширование (MD5, SHA-X), соль и спецификатор хеширования. То, что я ищу, - это метод преобразования результатов хеширования (байтовый массив (byte [])) в последовательность символов, которую я вижу в файле, то есть кодировку.

Пересекать
источник
Ваш вопрос очень связан с этим вопросом.
Broam
Используйте источник: sourceware.org/git/?p=glibc.git;a=tree;f=crypt
Джеймс

Ответы:

11

В случае MD5 crypt () соль - это просто случайная строка длиной до 8 символов из [a-zA-Z0-9./].

Затем соль и пароль хешируются, проходят через функцию усиления, затем кодируются с использованием варианта на Base64:

  • состояние MD5 (128 бит) перемешивается и разбивается на 6 групп, каждая из которых содержит 3 байта (последняя группа включает 2 байта с нулевым заполнением)
  • каждая группа из 3 байтов затем разделяется на 4 блока по 6 бит в каждом
  • наконец, каждая 6-битная группа отображается на символ в диапазоне [a-zA-Z0-9./]
SimonJ
источник
8

Если вы хотите знать только, как кодируется пароль, crypt () использует специальный тип кодировки Base64.

В кодировке Base64 используется следующая кодировка: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /

В то время как кодировка crypt () использует эту кодировку: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Кроме того, в отличие от Base64, здесь нет "=".

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

Я рекомендую прочитать эти два замечательных поста: «Хеширование паролей с помощью MD5-crypt по отношению к MD5» и «Внедрение SHA512-crypt против MD5-crypt» , для более полного объяснения.

Marco
источник
4

Первая часть хеша между $ указывает, какой алгоритм используется.

Проверьте http://en.wikipedia.org/wiki/Crypt_%28Unix%29 для списка того, что означают различные значения.

3dinfluence
источник
2

Вы ищете используемый алгоритм?

Традиционно в Unix и ранних версиях Linux использовался ослабленный DES, основанный не более чем на 8 символах пароля. Большинство современных установок Linux используют хеши MD5 для паролей, а некоторые поддерживают SHA. Кроме того, появилась более модульная поддержка дополнительных алгоритмов, в том числе Blowfish. GNU libc, используемый большинством Linux, поддерживает DES, MD5 и SHA, предоставляя вам несколько вариантов.

Конкретный тип используемого алгоритма хеширования указан в качестве начала пароля как $ DIGIT $. Например, $ 1 $ - это MD5.

Вы можете получить более подробную информацию из Википедии (см. Страницу на Crypt_ (Unix) ) или в Google для "crypt unix" или "crypt linux".

Кристофер Кашелл
источник