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
Стандартная библиотека языка Си, используемая почти во всех дистрибутивах Linux, предоставляет реализацию функции crypt, которая поддерживает DES, MD5 и (начиная с версии 2.7) семейство алгоритмов хеширования SHA-2. Ulrich Drepper, сопровождающий glibc, отклонил поддержку bcrypt, поскольку он не был одобрен NIST[12].
Mac OS
В MacOS X нативная crypt()
предоставляет ограниченную функциональность, поддерживая только DES и BSDi. В OS X используется отдельная система для своих хешей.
Примечания
- Simson Garfinkel, Alan Schwartz, Gene Spafford. "Practical Unix & Internet Security". 2003. section "4.3.2.3 crypt16( ), DES Extended, and Modular Crypt Format". "The Modular Crypt Format (MCF) specifies an extensible scheme for formatting encrypted passwords. MCF is one of the most popular formats for encrypted passwords"
- "Modular Crypt Format: or, a side note about a standard that isn’t".
- "Binary Modular Crypt Format"
- crypt - perldoc.perl.org
- PHP: crypt - Manual
- アーカイブされたコピー (недоступная ссылка). Дата обращения: 9 февраля 2013. Архивировано 2 октября 2012 года.
- 36.5. crypt — Function to check Unix passwords — Python 2.7.11 documentation
- Class: String (Ruby 2.3.0)
- Password Hash Competition string format .
- passlib.hash.bigcrypt - BigCrypt — Passlib v1.6.5 Documentation
- passlib.hash.crypt16 - Crypt16 — Passlib v1.6.5 Documentation
- bcrypt support for passwords in /etc/shadow - Red Hat Customer Portal
Ссылки
- Исходный код crypt(3) из седьмой редакции Unix систем (реализующий DES)
- Пример использования
- Онлайн генерация glibc2 совместимого crypt(3) (недоступная ссылка)
- Реализация для .NET