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