stringtranslate.com

крипта (С)

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

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

Связь с утилитой шифрования Unix

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

Подробности

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

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

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

Функции выведения ключей, поддерживаемые crypt

Со временем были введены различные алгоритмы. Для обеспечения обратной совместимости каждая схема начала использовать некоторое соглашение о сериализации хэшей паролей , которое позже было названо Modular Crypt Format (MCF). [3] Старые хэши crypt(3), созданные до фактического стандарта MCF, могут различаться от схемы к схеме. Четко определенное подмножество Modular Crypt Format было создано во время соревнования Password Hashing Competition . [3] Формат определяется как: [10]

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

где

Кодировка radix-64 в crypt называется B64 и использует алфавит ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz, который отличается от более распространенного RFC 4648 base64.

Подмножество PHC охватывает большинство хэшей MCF. Существует ряд дополнительных методов, определяемых приложением. [3]

Оригинальная реализация с использованием пароля в качестве ключа

Первоначальная реализация библиотечной функции crypt() [11] в третьем издании Unix [12] имитировала шифровальную машину M-209 . Вместо того, чтобы шифровать пароль ключом, что позволило бы восстановить пароль из зашифрованного значения и ключа, она использовала сам пароль в качестве ключа, а база данных паролей содержала результат шифрования пароля этим ключом.

Традиционная схема на основе DES

Первоначальная схема шифрования паролей оказалась слишком быстрой и, таким образом, подверженной перебору наиболее вероятных паролей. [11] В седьмом издании Unix [ 13] схема была изменена на модифицированную форму алгоритма DES . Целью этого изменения было сделать шифрование медленнее. Кроме того, алгоритм включал 12-битную соль , чтобы гарантировать, что злоумышленник будет вынужден взламывать каждый пароль независимо, а не иметь возможность атаковать всю базу паролей одновременно.

Подробно, пароль пользователя усекается до восьми символов, и они приводятся к 7 битам каждый; это формирует 56-битный ключ DES. Затем этот ключ используется для шифрования блока из всех битов-нулей, а затем шифротекст снова шифруется тем же ключом, и так далее, в общей сложности 25 шифрований DES. 12-битная соль используется для возмущения алгоритма шифрования, поэтому стандартные реализации DES не могут использоваться для реализации crypt(). Соль и окончательный шифротекст кодируются в печатную строку в форме base64 .

Технически это не шифрование, поскольку данные (все биты нулевые) не хранятся в секрете; они широко известны всем заранее. Однако одно из свойств DES заключается в том, что он очень устойчив к восстановлению ключа даже в ситуациях с известным открытым текстом . Теоретически возможно, что два разных пароля могут привести к абсолютно одинаковому хешу. Таким образом, пароль никогда не «расшифровывается»: он просто используется для вычисления результата, и совпадающие результаты считаются доказательством того, что пароли были «одинаковыми».

Преимущества этого метода заключаются в том, что хэш-текст можно хранить и копировать между системами Unix, не раскрывая соответствующий открытый текстовый пароль системным администраторам или другим пользователям. Эта переносимость работает уже более 30 лет во многих поколениях вычислительной архитектуры и во многих версиях Unix от многих поставщиков.

Слабые стороны традиционной схемы

Первоначально был выбран традиционный алгоритм шифрования на основе DES, поскольку DES был устойчив к восстановлению ключа даже при атаках с использованием «известного открытого текста», а также потому, что он был затратным в вычислительном отношении. На самых ранних машинах Unix для вычисления хеша пароля требовалось более целой секунды. Это также делало его достаточно устойчивым к атакам по словарю в ту эпоху. В то время хеши паролей обычно хранились в файле учетной записи ( /etc/passwd), который мог прочитать любой пользователь системы. (Этот файл учетной записи также использовался для преобразования номеров идентификаторов пользователей в имена, а имен пользователей в полные имена и т. д.).

За три десятилетия с тех пор компьютеры стали намного мощнее. Закон Мура в целом соблюдался, поэтому скорость и мощность компьютера, доступные для заданных финансовых инвестиций, удвоились более чем в 20 раз с момента написания Unix. Это давно сделало алгоритм на основе DES уязвимым для атак по словарю, а Unix и Unix-подобные системы, такие как Linux, долгое время использовали «теневые» файлы , перенося только значения хэша пароля из файла учетной записи ( /etc/passwd) в файл (условно называемый /etc/shadow), который могут читать только привилегированные процессы.

Чтобы увеличить вычислительную стоимость взлома пароля, некоторые сайты Unix в частном порядке начали увеличивать количество раундов шифрования на ad hoc основе. [ требуется цитата ] Это имело побочный эффект, сделав их crypt()несовместимыми со стандартом crypt(): хеши имели ту же текстовую форму, но теперь вычислялись с использованием другого алгоритма. Некоторые сайты также воспользовались этим эффектом несовместимости, изменив начальный блок со стандартного all-bits-zero. [ необходима цитата ] Это не увеличило стоимость хеширования, но означало, что предварительно вычисленные хеш-словари на основе стандартного crypt() не могли быть применены.

Расширенная схема BSDi на основе DES

BSDi использовала небольшую модификацию классической схемы на основе DES. BSDi расширила соль до 24 бит и сделала количество раундов переменным (до 2 24 -1). Выбранное количество раундов кодируется в сохраненном хэше пароля, избегая несовместимости, которая возникала, когда сайты изменяли количество раундов, используемых в исходной схеме. Эти хэши идентифицируются по начинающимся с подчеркивания ( _), за которым следуют 4 символа, представляющие количество раундов, а затем 4 символа для соли.

Алгоритм BSDi также поддерживает более длинные пароли, используя DES для сжатия исходного длинного пароля до восьми 7-битных байтов, поддерживаемых исходным алгоритмом.

Схема на основе MD5

Poul-Henning Kamp разработал причудливый и (в то время) вычислительно затратный алгоритм, основанный на алгоритме дайджеста сообщений MD5 . Сам по себе MD5 обеспечивает хорошую криптографическую стойкость для хэша пароля, но он разработан так, чтобы его можно было вычислить довольно быстро относительно стойкости, которую он обеспечивает. Схема crypt() разработана так, чтобы его было трудно вычислить, чтобы замедлить атаки по словарю. Печатная форма хэшей паролей MD5 начинается с $1$.

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

Сначала парольная фраза и соль хэшируются вместе, давая дайджест сообщения MD5. Затем создается новый дайджест, хэширующий вместе парольную фразу, соль и первый дайджест, все в довольно сложной форме. Затем этот дайджест проходит через тысячу итераций функции, которая повторно хэширует его вместе с парольной фразой и солью способом, который меняется между раундами. Выход последнего из этих раундов — это результирующий хэш парольной фразы.

Фиксированное количество итераций привело к тому, что эта схема потеряла вычислительные затраты, которые она когда-то имела, и теперь предпочтение отдается переменному количеству раундов. В июне 2012 года Пол-Хеннинг Камп объявил алгоритм небезопасным и призвал пользователей перейти на более сильные шифраторы паролей. [14]

Схема на основе Blowfish

Нильс Провос и Дэвид Мазьер разработали схему crypt() под названием bcrypt на основе Blowfish и представили ее на USENIX в 1999 году. [15] Печатная форма этих хэшей начинается с $2$, $2a$, $2b$, $2x$или $2y$в зависимости от того, какой вариант алгоритма используется:

Blowfish выделяется среди блочных шифров своей дорогой фазой настройки ключа. Он начинается с подключей в стандартном состоянии, затем использует это состояние для выполнения блочного шифрования с использованием части ключа и использует результат этого шифрования (на самом деле хеширования) для замены некоторых подключей. Затем он использует это измененное состояние для шифрования другой части ключа и использует результат для замены большего количества подключей. Он продолжает таким образом, используя постепенно измененное состояние для хеширования ключа и замены битов состояния, пока все подключи не будут установлены.

Число раундов ключа — это степень двойки, которая является входными данными для алгоритма. Число кодируется в текстовом хэше, например$2y$10...

Схема хэширования NT

FreeBSD реализовала поддержку алгоритма хэширования NT LAN Manager для обеспечения более простой совместимости с учетными записями NT через MS-CHAP . [19] Известно, что алгоритм NT-Hash слаб, поскольку он использует устаревший алгоритм хэширования md4 без какой-либо соли. [20] FreeBSD использовала $3$для этого префикс. Его использование не рекомендуется, так как его легко взломать. [1]

Схема на основе SHA2

Широко используемая схема на основе MD5 стала более доступной для атак по мере увеличения мощности компьютеров. Хотя система на основе Blowfish имеет возможность добавлять раунды и, таким образом, остается сложным алгоритмом пароля, она не использует алгоритм, одобренный NIST . В свете этих фактов Ульрих Дреппер  [de] из Red Hat возглавил попытку создать схему на основе хэш-функций SHA-2 (SHA-256 и SHA-512). [21] Печатная форма этих хэшей начинается с $5$(для SHA-256) или $6$(для SHA-512) в зависимости от того, какой вариант SHA используется. Его конструкция похожа на криптографию на основе MD5, с несколькими заметными отличиями: [21]

Спецификация и пример кода были опубликованы в открытом доступе; их часто называют «SHAcrypt». [24]

Другие хэши

$y$
yescrypt — это расширение scrypt ( $7$) и финалист PHC. Он используется в нескольких дистрибутивах Linux как альтернатива существующим схемам. [25] Для использования этого хэша хэш libcryptиз glibc заменяется обратно совместимым хэшем из проекта "libxcrypt". [26]
$argon2d$, $argon2i$,$argon2ds$
Это названия, присвоенные PHC алгоритму Argon2 , но, по-видимому, они не получили широкого распространения.

Дополнительные форматы, если таковые имеются, описаны на страницах руководства по реализациям. [27]

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

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

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

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

линукс

Библиотека GNU C (glibc), используемая почти всеми дистрибутивами Linux, обеспечивает реализацию функции crypt , которая поддерживает алгоритмы хеширования на основе DES, MD5 и (начиная с версии 2.7) SHA-2, упомянутые выше. Ульрих Дреппер, сопровождающий glibc, отклонил поддержку bcrypt (схема 2), поскольку она не одобрена NIST . [32] Для систем без bcrypt доступна общедоступная библиотека crypt_blowfish . Она была интегрирована в glibc в SUSE Linux . [33]

В августе 2017 года glibc объявила о планах полностью удалить свою реализацию crypt. В ответ на это ряд дистрибутивов Linux (включая Fedora и Debian, но не ограничиваясь ими) перешли на libxcrypt — реализацию, совместимую с ABI, которая дополнительно поддерживает новые алгоритмы, включая bcrypt и yescrypt. [34]

Библиотека musl C поддерживает схемы 1, 2, 5 и 6, а также традиционную схему DES. Традиционный код DES основан на BSD FreeSec с модификацией для совместимости с glibc UFC-Crypt . [35]

macOS

Собственный Darwin crypt()обеспечивает ограниченную функциональность, поддерживая только DES и BSDi. OS X использует несколько систем для собственных хэшей паролей, начиная от старой NeXTStep netinfo и заканчивая новой системой служб каталогов (ds). [36] [37]

Смотрите также

Ссылки

  1. ^ ab crypt(3) –  Руководство по функциям библиотеки FreeBSD
  2. ^ Симсон Гарфинкель, Алан Шварц, Джин Спаффорд. «Практическая безопасность Unix и Интернета». 2003. раздел «4.3.2.3 crypt16( ), DES Extended и Modular Crypt Format». «Modular Crypt Format (MCF) определяет расширяемую схему форматирования зашифрованных паролей. MCF — один из самых популярных форматов для зашифрованных паролей»
  3. ^ abcd "Modular Crypt Format — Passlib v1.7.1 Documentation". Pythonhosted.org . Получено 2 декабря 2018 г. .
  4. ^ "ademarre/binary-mcf". GitHub.com . Получено 2 декабря 2018 г. .
  5. ^ "crypt - perldoc.perl.org". Perldoc.perl.org . Получено 2 декабря 2018 г. .
  6. ^ "PHP: crypt - Руководство". Us.php.net . Получено 2 декабря 2018 г. .
  7. ^ "crypt()". Архивировано из оригинала 2012-10-02 . Получено 2013-02-09 .
  8. ^ "crypt — Функция проверки паролей Unix — Документация Python 3.7.1". Docs.python.org . Получено 2 декабря 2018 г. .
  9. ^ "Класс: String (Ruby 2.5.3)". Ruby-doc.org . Получено 2 декабря 2018 г. .
  10. ^ Конкурс хэшей паролей. "Формат строки PHC". Github .
  11. ^ ab Моррис, Роберт; Томпсон, Кен (1978-04-03). "Безопасность паролей: История вопроса". Bell Laboratories . Получено 2013-12-17 .
  12. ^ "crypt – шифрование пароля". UNIX, третье издание, руководство программиста . 1973-01-15.
  13. ^ "crypt, setkey, encrypt – DES-шифрование". UNIX, седьмое издание, руководство программиста . 1979.
  14. ^ "Автор больше не считает шифровальщик паролей Md5crypt безопасным — PHKs Bikeshed". Phk.freebsd.dk . Архивировано из оригинала 17 марта 2018 г. Получено 2 декабря 2018 г.
  15. ^ Провос, Нильс; Мазьер, Дэвид (1999). «Адаптивная к будущему схема паролей». Труды Ежегодной технической конференции USENIX 1999 года : 81–92.
  16. Дизайнер, Solar (2011-06-21). "crypt_blowfish 1.1; обновление безопасности Owl glibc".См. также CVE - 2011-2483.
  17. ^ "src/lib/libc/crypt/bcrypt.c – view – 1.27". Cvsweb.openbsd.org . Получено 2016-05-14 .
  18. ^ Дизайнер, Solar (2012-01-02). "OpenBSD bcrypt 8-битный key_len wraparound".
  19. ^ "NT MD4 password hash как новый метод шифрования паролей для FreeBSD". Mail-archive.com . Получено 2 декабря 2018 г. .
  20. ^ "Протокол аутентификации NTLM и поставщик поддержки безопасности". Davenport.sourceforge.net . Получено 2 декабря 2018 г. .
  21. ^ ab Drepper, Ulrich (19 сентября 2007 г.). "Unix crypt with SHA-256/512" . Получено 21 ноября 2018 г. .
  22. ^ Sun Microsystems. "crypt_sunmd5(5) man page". Архивировано из оригинала 2008-04-16 . Получено 2008-03-05 .
  23. ^ Маффетт, Алек (2005-12-05). "OpenSolaris, Pluggable Crypt и алгоритм хэширования паролей SunMD5" . Получено 2012-08-11 .
  24. ^ ab Дреппер, Ульрих. «Шифрование Unix с использованием SHA-256 и SHA-512».
  25. ^ «FESCo говорит «да» Fedora 35, использующей Yescrypt для хеширования теневых паролей — Phoronix». www.phoronix.com .
  26. ^ "Changes/yescrypt как метод хэширования по умолчанию для shadow - Fedora Project Wiki". libxcrypt: уже способен вычислять хэши yescrypt, начиная с версии 4.3 .
  27. ^
  28. ^ "passlib.hash.bigcrypt - BigCrypt — Passlib v1.7.1 Documentation". Pythonhosted.org . Получено 2 декабря 2018 г. .
  29. ^ "passlib.hash.crypt16 - Crypt16 — Passlib v1.7.1 Documentation". Pythonhosted.org . Получено 2 декабря 2018 г. .
  30. ^ libxcrypt - Расширенная библиотека шифрования для descrypt, md5crypt, bcrypt и других
  31. ^ "Debian manpage crypt". manpages.debian.org . Получено 11 января 2022 г. .– Debian bullseye использует libxcrypt. См. https://tracker.debian.org/pkg/libxcrypt .
  32. ^ "Поддержка bcrypt для паролей в /etc/shadow - Red Hat Customer Portal". Access.redhat.com . 10 июля 2018 г. . Получено 2 декабря 2018 г. .
  33. ^ "хеширование паролей bcrypt ("шифрование паролей") для вашего программного обеспечения и ваших серверов". www.openwall.com .
  34. ^ "Изменения/Замена glibc libcrypt на libxcrypt — Fedora Project Wiki". fedoraproject.org .
  35. ^ "crypt_r.c\crypt\src - musl - musl - реализация стандартной библиотеки для систем на базе Linux". git.musl-libc.org .
  36. ^ «Как Mac OS X реализует аутентификацию по паролю». Dribin.org . 7 апреля 2006 г. Получено 2 декабря 2018 г.
  37. ^ "Как взломать пароли Mac OS X - Online Hash Crack". Onlinehashcrack.com . Получено 2 декабря 2018 г. .

Внешние ссылки