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) хеши могут отличаться от схемы к схеме. Во время Соревнования хеширования паролей[en] был сформирован следующий формат, который представляет среднюю форму[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 используется отдельная система для своих хешей.

Примечания[править | править вики-текст]

Ссылки[править | править вики-текст]