Крипта (C) - Википедия - crypt (C)

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

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

Связь с утилитой Unix crypt

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

Подробности

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

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

В крипта () библиотечная функция также включена в Perl,[5] PHP,[6] Щука,[7] Python,[8] и Рубин[9] языки программирования.

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

Со временем были введены различные алгоритмы. Включить Обратная совместимость, каждая схема начиналась с использования некоторого соглашения сериализация то хеши паролей позже он был назван модульным форматом крипт (MCF).[3] Старые хэши crypt (3), сгенерированные до де-факто стандарта MCF, могут отличаться от схемы к схеме. Четко определенное подмножество модульного формата крипт было создано во время Конкурс по хешированию паролей.[3] Формат определяется как:[10]

$ [$ = (, = ) *] [$ [$ ]]

куда

  • я бы: идентификатор, представляющий алгоритм хеширования (например, 1 для MD5, 5 для SHA-256 так далее.)
  • парам имя и его ценить: параметры сложности хеширования, такие как количество раундов / итераций
  • соль: Base64 -подобно закодированный соль
  • хэш: Base64 -как закодированный результат хеширования пароля и соли
ID схемыСхемаПример
DESKyq4bCxAXJkbg
_BSDi_EQ0.jzhSVeUyoSqLupI
1MD5$ 1 $ etNnh7FA $ OlM7eljE / B7F1J4XYNnk81
2, , 2x, 2 годаbcrypt$ 2a $ 10 $ VIhIOofSMqgdGlL4wzE // e.77dAQGqntF / 1dT7bqCrVtquInWy2qi
3NTHASH$ 3 $ 8846f7eaee8fb117ad06bdd830b7586c
5SHA-256$ 5 $ 9ks3nNEqv31FX.F $ gdEoLFsCRsn / WRN3wxUnzfeZLoooVlzeF4WjLomTRFD
6SHA-512$ 6 $ qoE2letU $ wWPRl.PVczjzeMVgjiA8LLy2nOyZbf7Amj3qLIL978o18gbMySdKZ7uepq9tmMQXxyTIrS12Pln.2Q / 6Xscao0
мкр5Solaris MD5$ md5, раундов = 5000 $ GUBv0xjJ $$ mSwgIswdjlTY0YxV7HBVm0
sha1PBKDF1 с SHA-1$ sha1 $ 40000 $ jtNX3nZ2 $ hBNaIXkt4wBI2o5rsi8KejSjNqIq

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

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

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

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

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

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

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

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

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

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

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

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

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

  • $2$ - Устаревший.
  • 2 доллара США - Текущий ключ, используемый для идентификации этой схемы. Поскольку в 2011 году в системе, отличной от OpenBSD, была обнаружена серьезная уязвимость безопасности. crypt_blowfish реализация алгоритма,[16] хэши, обозначенные этой строкой, теперь неоднозначны и могли быть созданы некорректной реализацией или последующей фиксированной реализацией. Уязвимость может быть вызвана некоторыми строками паролей, содержащими символы, отличные от ASCII (8-битные).
  • 2 млрд долларов - Используется в последних реализациях OpenBSD для устранения проблемы циклического перехода.[17] В предыдущих версиях алгоритма возникла проблема с длинными паролями. По замыслу, длинные пароли усекаются до 72 символов, но существует проблема обхода байтовыми целыми числами, когда пароли определенной длины имеют слабые хэши.[18]
  • 2 доллара США - Флаг добавлен после crypt_blowfish обнаружение ошибок. Старые хэши можно переименовать в 2 доллара США чтобы указать, что они были созданы с использованием неработающего алгоритма. Эти хэши все еще слабые, но, по крайней мере, ясно, какой алгоритм использовался для их генерации.
  • $ 2y $ - Флаг в crypt_blowfish однозначно использовать новый исправленный алгоритм. В более старой реализации, страдающей от ошибки, $ 2y $ просто не сработает. В более новой, фиксированной реализации это даст тот же результат, что и использование 2 доллара США.

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

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

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

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

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

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

  • Это позволяет избежать добавления постоянных данных за несколько шагов.
  • Алгоритм MD5 будет многократно добавлять первую букву пароля;[нужна цитата ] этот шаг был существенно изменен.
  • Вдохновлен Солнце реализация crypt (), добавлена ​​возможность указывать количество итераций (раундов), которые выполняет основной цикл в алгоритме[22][23]
  • Количество итераций по умолчанию - 5000, минимум 1000 и максимум 999 999 999.[24]

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

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

ID схемыСхемаLinux (glibc )FreeBSDNetBSDOpenBSDСолярисMacOS
DESдададададада
_BSDiНетдададаНетда
1MD5дададададаНет
2, 2а, 2х, 2гbcryptНетдадададаНет
3NTHASHНетдаНетНетНетНет
5SHA-2562.7+8.3+НетНетдаНет
6SHA-5122.7+8.3+НетНетдаНет
мкр5Solaris MD5НетНетНетНетдаНет
sha1PBKDF1 с SHA1НетНетдаНетНетНет

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

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

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

GNU / Linux

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

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

macOS

Уроженец Дарвина крипта () предоставляет ограниченную функциональность, поддерживая только DES и BSDi. OS X использует несколько систем для собственных хэшей паролей, начиная от старого NeXTStep netinfo к более новой системе служб каталогов (DS).[30][31]

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

Рекомендации

  1. ^ а б склеп (3) – FreeBSD Библиотечные функции Руководство
  2. ^ Симсон Гарфинкель, Алан Шварц, Джин Спаффорд."Практическая Unix и Интернет-безопасность".2003.раздел «4.3.2.3 crypt16 (), DES Extended и модульный формат шифрования». «Modular Crypt Format (MCF) определяет расширяемую схему для форматирования зашифрованных паролей. MCF - один из самых популярных форматов для зашифрованных паролей»
  3. ^ а б c d "Modular Crypt Format - Passlib v1.7.1 Documentation". Pythonhosted.org. Получено 2 декабря 2018.
  4. ^ "ademarre / binary-mcf". GitHub.com. Получено 2 декабря 2018.
  5. ^ "крипта - perldoc.perl.org". Perldoc.perl.org. Получено 2 декабря 2018.
  6. ^ «PHP: crypt - Руководство». Us.php.net. Получено 2 декабря 2018.
  7. ^ "крипта ()". Архивировано из оригинал на 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. ^ а б Моррис, Роберт; Томпсон, Кен (1978-04-03). «Защита паролем: история болезни». Bell Laboratories. Получено 2013-12-17.
  12. ^ "crypt - кодировка пароля". Руководство программиста UNIX, третье издание. 1973-01-15.
  13. ^ "crypt, setkey, encrypt - шифрование DES". Руководство программиста седьмого издания UNIX. 1979.
  14. ^ "Md5crypt Password Scrambler больше не считается безопасным автором - PHKs Bikeshed". Phk.freebsd.dk. Архивировано из оригинал 17 марта 2018 г.. Получено 2 декабря 2018.
  15. ^ Провос, Нильс; Мазьер, Давид (1999). «Схема паролей, адаптируемая к будущему». Материалы Ежегодной технической конференции USENIX 1999 г.: 81–92.
  16. ^ Дизайнер, Solar (21.06.2011). "crypt_blowfish 1.1; Обновление безопасности Owl glibc". Смотрите также CVE -2011-2483.
  17. ^ "src / lib / libc / crypt / bcrypt.c - просмотр - 1.27". Cvsweb.openbsd.org. Получено 2016-05-14.
  18. ^ Дизайнер, Solar (2012-01-02). "OpenBSD bcrypt 8-битный перенос key_len".
  19. ^ «Хеш пароля NT MD4 как новый метод шифрования пароля для FreeBSD». Mail-archive.com. Получено 2 декабря 2018.
  20. ^ "Протокол аутентификации NTLM и поставщик поддержки безопасности". Davenport.sourceforge.net. Получено 2 декабря 2018.
  21. ^ а б Дреппер, Ульрих (19 сентября 2007 г.). «Скрипа Unix с SHA-256/512». Получено 21 ноября 2018.
  22. ^ Sun Microsystems. "Справочная страница crypt_sunmd5 (5)". Архивировано из оригинал на 2008-04-16. Получено 2008-03-05.
  23. ^ Маффет, Алек (2005-12-05). "OpenSolaris, Pluggable Crypt и алгоритм хеширования паролей SunMD5". Получено 2012-08-11.
  24. ^ а б Дреппер, Ульрих. "Шифрование Unix с использованием SHA-256 и SHA-512".
  25. ^ "passlib.hash.bigcrypt - BigCrypt - Passlib v1.7.1 Documentation". Pythonhosted.org. Получено 2 декабря 2018.
  26. ^ "passlib.hash.crypt16 - Crypt16 - Passlib v1.7.1 Documentation". Pythonhosted.org. Получено 2 декабря 2018.
  27. ^ «Поддержка bcrypt для паролей в / etc / shadow - Портал клиентов Red Hat». Access.redhat.com. Получено 2 декабря 2018.
  28. ^ "bcrypt хеширование паролей (" шифрование паролей ") для вашего программного обеспечения и ваших серверов". www.openwall.com.
  29. ^ "crypt_r.c crypt src - musl - musl - реализация стандартной библиотеки для систем на базе Linux". git.musl-libc.org.
  30. ^ «Как Mac OS X реализует аутентификацию по паролю». Dribin.org. Получено 2 декабря 2018.
  31. ^ «Как взломать пароли Mac OS X - взлом хэша в Интернете». Onlinehashcrack.com. Получено 2 декабря 2018.

внешняя ссылка