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). Оскільки ніякого стандарту спочатку не було, старі crypt(3) хеші можуть відрізнятися від схеми до схеми. Під час змагання з хешування паролів[en] був сформований наступний формат[9]:

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

де

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

На жаль, цей стандарт виробився не відразу і не всі схеми слідують йому.

Схема Алгоритм Приклад
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 (glibc) 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 з 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 використовується окрема система для своїх хешів.

Примітки[ред. | ред. код]

  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. "Modular Crypt Format: or, a side note about a standard that isn’t" [Архівовано 9 вересня 2017 у Wayback Machine.].
  3. "Binary Modular Crypt Format". Архів оригіналу за 11 червня 2018. Процитовано 16 квітня 2018.
  4. crypt - perldoc.perl.org. Архів оригіналу за 16 квітня 2018. Процитовано 16 квітня 2018.
  5. PHP: crypt - Manual. Архів оригіналу за 16 квітня 2018. Процитовано 16 квітня 2018.
  6. アーカイブされたコピー. Архів оригіналу за 2 жовтня 2012. Процитовано 9 лютого 2013.
  7. 36.5. crypt — Function to check Unix passwords — Python 2.7.11 documentation. Архів оригіналу за 26 жовтня 2012. Процитовано 16 квітня 2018.
  8. Class: String (Ruby 2.3.0). Архів оригіналу за 3 жовтня 2011. Процитовано 16 квітня 2018.
  9. Password Hash Competition string format. Архів оригіналу за 27 січня 2017. Процитовано 21 березня 2016.
  10. passlib.hash.bigcrypt - BigCrypt — Passlib v1.6.5 Documentation. Архів оригіналу за 7 липня 2017. Процитовано 16 квітня 2018.
  11. passlib.hash.crypt16 - Crypt16 — Passlib v1.6.5 Documentation. Архів оригіналу за 7 липня 2017. Процитовано 16 квітня 2018.
  12. bcrypt support for passwords in /etc/shadow - Red Hat Customer Portal. Архів оригіналу за 17 квітня 2018. Процитовано 16 квітня 2018.

Посилання[ред. | ред. код]