Crypt (C)

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

Более формально, crypt предоставляет криптографические функции формирования ключа для проверки пароля и хранения в системах Unix.

Отношение к Unix утилите crypt

[править | править код]

В операционных системах UNIX есть одноимённая утилита crypt, которую часто путают с библиотечной функцией C. Чтобы различать их, обычно ссылаются на системную утилиту как crypt(1), так как она документирована в разделе 1 руководства UNIX, а на криптографическую хеш-функцию как crypt(3), так как она документирована в секции 3.

Одна и та же функция crypt используется как для генерирования нового хеша для хранения, так и для вычисления хеша проверяемого пароля с записанной солью для сравнения.

Современные реализации Unix crypt(3) поддерживают различные схемы хеширования. В частности, хеш-алгоритм может быть определён по уникальному идентификатору из префикса в результирующем тексте хеша, который следует де-факто стандарту называемому Modular Crypt Format (MCF)[1][2][3].

Библиотечная функция crypt() также включена в языки программирования Perl[4], PHP[5], Pike[6], Python[7] и Ruby[8].

Поддерживаемые функции формирования ключа

[править | править код]

С течением времени вводятся различные алгоритмы. Чтобы поддерживать обратную совместимость, авторы начали использовать конвенции по сериализации в хешах паролей, который позже был назван Modular Crypt Format (MCF)[2]. Поскольку никакого стандарта изначально не было, старые crypt(3) хеши могут отличаться от схемы к схеме. Во время Соревнования хеширования паролей[англ.] был сформирован следующий формат, который представляет среднюю форму[9]:

$<id>[$<param>=<value>(,<param>=<value>)*][$<salt>[$<hash>]]

где

  • id — идентификатор схемы хеширования, которая отображает алгоритм (например, 1 для схемы с алгоритмом MD5, 5 для SHA-256 и т.д.)
  • param имя параметра и value его значение — параметры сложности, например число раундов
  • salt — Base64-подобно закодированная соль
  • hash — Base64-подобно закодированный результат хеширования пароля и соли.

К сожалению, этот стандарт выработался не сразу и не все схемы следуют ему.

Схема Алгоритм Пример
DES Kyq4bCxAXJkbg
_ BSDi _EQ0.jzhSVeUyoSqLupI
1 MD5 $1$etNnh7FA$OlM7eljE/B7F1J4XYNnk81
2, 2a, 2x, 2y bcrypt $2a$10$VIhIOofSMqgdGlL4wzE//e.77dAQGqntF/1dT7bqCrVtquInWy2qi
3 NTHASH $3$$8846f7eaee8fb117ad06bdd830b7586c
5 SHA-256 $5$9ks3nNEqv31FX.F$gdEoLFsCRsn/WRN3wxUnzfeZLoooVlzeF4WjLomTRFD
6 SHA-512 $6$qoE2letU$wWPRl.PVczjzeMVgjiA8LLy2nOyZbf7Amj3qLIL978o18gbMySdKZ7uepq9tmMQXxyTIrS12Pln.2Q/6Xscao0
md5 Solaris MD5 $md5,rounds=5000$GUBv0xjJ$$mSwgIswdjlTY0YxV7HBVm0
sha1 PBKDF1 с SHA-1 $sha1$40000$jtNX3nZ2$hBNaIXkt4wBI2o5rsi8KejSjNqIq

Поддержка в операционных системах

[править | править код]
Scheme id Scheme Linux FreeBSD NetBSD OpenBSD Solaris MacOS
DES y y y y y y
_ BSDi y y y y
1 MD5 y y y y y
2, 2a, 2x, 2y bcrypt y y y y
3 NTHASH y
5 SHA-256 2.7+ 8.3+ y
6 SHA-512 2.7+ 8.3+ y
md5 Solaris MD5 y
sha1 PBKDF1 with SHA1 y

Архаичные Unix-схемы

[править | править код]

BigCrypt — это модификация DES, используемая в HP-UX, Digital Unix, и OSF/1. Главное различие с DES в том, что BigCrypt использует все символы пароля, а не только первые 8 и поэтому имеет хеш различной длины[10].

Crypt16 — это небольшая модификация DES, которая поддерживает пароли до 16 символов. Использовалась в Ultrix и Tru64[11].

Стандартная библиотека языка Си, используемая почти во всех дистрибутивах Linux, предоставляет реализацию функции crypt, которая поддерживает DES, MD5 и (начиная с версии 2.7) семейство алгоритмов хеширования SHA-2. Ulrich Drepper, сопровождающий glibc, отклонил поддержку bcrypt, поскольку он не был одобрен NIST[12].

В MacOS X нативная crypt() предоставляет ограниченную функциональность, поддерживая только DES и BSDi. В OS X используется отдельная система для своих хешей.

Примечания

[править | править код]
  1. Simson Garfinkel, Alan Schwartz, Gene Spafford. "Practical Unix & Internet Security" Архивная копия от 31 июля 2020 на Wayback Machine. 2003. section "4.3.2.3 crypt16( ), DES Extended, and Modular Crypt Format" Архивная копия от 18 июня 2018 на Wayback Machine. "The Modular Crypt Format (MCF) specifies an extensible scheme for formatting encrypted passwords. MCF is one of the most popular formats for encrypted passwords"
  2. 1 2 "Modular Crypt Format: or, a side note about a standard that isn’t" Архивная копия от 9 сентября 2017 на Wayback Machine.
  3. "Binary Modular Crypt Format". Дата обращения: 21 марта 2016. Архивировано 11 июня 2018 года.
  4. crypt - perldoc.perl.org. Дата обращения: 21 марта 2016. Архивировано 16 апреля 2018 года.
  5. PHP: crypt - Manual. Дата обращения: 21 марта 2016. Архивировано 16 апреля 2018 года.
  6. アーカイブされたコピー. Дата обращения: 9 февраля 2013. Архивировано из оригинала 2 октября 2012 года.
  7. 36.5. crypt — Function to check Unix passwords — Python 2.7.11 documentation. Дата обращения: 21 марта 2016. Архивировано 26 октября 2012 года.
  8. Class: String (Ruby 2.3.0). Дата обращения: 21 марта 2016. Архивировано 3 октября 2011 года.
  9. Password Hash Competition string format. Дата обращения: 21 марта 2016. Архивировано 27 января 2017 года.
  10. passlib.hash.bigcrypt - BigCrypt — Passlib v1.6.5 Documentation. Дата обращения: 21 марта 2016. Архивировано 7 июля 2017 года.
  11. passlib.hash.crypt16 - Crypt16 — Passlib v1.6.5 Documentation. Дата обращения: 21 марта 2016. Архивировано 7 июля 2017 года.
  12. bcrypt support for passwords in /etc/shadow - Red Hat Customer Portal. Дата обращения: 21 марта 2016. Архивировано 17 апреля 2018 года.