stringtranslate.com

склеп (С)

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

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

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

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

Подробности

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

Современные реализации библиотеки crypt в Unix поддерживают множество хеш-схем. Конкретный используемый алгоритм хэширования можно идентифицировать по уникальному префиксу кода в результирующем хэш-тексте, соответствующем стандарту де-факто, называемому модульным форматом шифрования. [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, могут варьироваться от схемы к схеме. Четко определенное подмножество формата модульного шифрования было создано во время конкурса хеширования паролей . [3] Формат определяется как: [10]

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

где

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

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

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

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

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

Пол-Хеннинг Камп разработал причудливый и (на тот момент) дорогостоящий в вычислительном отношении алгоритм, основанный на алгоритме дайджеста сообщения 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 . В свете этих фактов Ульрих Дреппер  [де] из 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] Чтобы использовать этот хэш, файл libcryptfrom 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 , используемая почти во всех дистрибутивах Linux, обеспечивает реализацию функции crypt , которая поддерживает упомянутые выше алгоритмы хеширования на основе DES, MD5 и (начиная с версии 2.7) SHA-2. Ульрих Дреппер, сопровождающий glibc, отклонил поддержку bcrypt (схема 2), поскольку она не одобрена NIST . [31] Для систем без bcrypt доступна общедоступная библиотека crypt_blowfish . Он был интегрирован в glibc в SUSE Linux . [32] Кроме того, вышеупомянутая libxcrypt используется для замены glibc crypt() в системах с поддержкой Yescrypt.

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

macOS

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

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

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

  1. ^ ab crypt(3) -  Руководство по функциям библиотеки FreeBSD
  2. ^ Симсон Гарфинкель, Алан Шварц, Джин Спаффорд. «Практическая Unix и интернет-безопасность». 2003. раздел «4.3.2.3 crypt16(), расширенный DES и модульный формат шифрования». «Модульный формат шифрования (MCF) определяет расширяемую схему форматирования зашифрованных паролей. MCF — один из самых популярных форматов для зашифрованных паролей».
  3. ^ abcd «Формат модульного шифрования — документация Passlib v1.7.1». Pythonhosted.org . Проверено 2 декабря 2018 г.
  4. ^ "Адемар/двоичный-mcf". GitHub.com . Проверено 2 декабря 2018 г.
  5. ^ "крипта - perldoc.perl.org" . Perldoc.perl.org . Проверено 2 декабря 2018 г.
  6. ^ «PHP: крипта — Руководство» . Us.php.net . Проверено 2 декабря 2018 г.
  7. ^ "крипта()". Архивировано из оригинала 2 октября 2012 г. Проверено 9 февраля 2013 г.
  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». Гитхаб .
  11. ^ Аб Моррис, Роберт; Томпсон, Кен (3 апреля 1978 г.). «Безопасность паролем: история болезни». Лаборатории Белла . Проверено 17 декабря 2013 г.
  12. ^ «крипта – кодировка пароля» . Руководство программиста UNIX, третье издание . 15 января 1973 г.
  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 (21 июня 2011 г.). «crypt_blowfish 1.1; обновление безопасности Owl glibc».См. также CVE - 2011-2483.
  17. ^ «src/lib/libc/crypt/bcrypt.c – просмотр – 1.27». Cvsweb.openbsd.org . Проверено 14 мая 2016 г.
  18. ^ Дизайнер, Solar (2 января 2012 г.). «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. ^ Сан Микросистемс. «Справочная страница crypt_sunmd5(5)». Архивировано из оригинала 16 апреля 2008 г. Проверено 5 марта 2008 г.
  23. ^ Маффет, Алек (5 декабря 2005 г.). «OpenSolaris, подключаемый крипт и алгоритм хэширования паролей SunMD5» . Проверено 11 августа 2012 г.
  24. ^ аб Дреппер, Ульрих. «Скрипт Unix с использованием SHA-256 и SHA-512».
  25. ^ «FESCo говорит «да» Fedora 35, используя Yescrypt для хеширования теневых паролей — Phoronix» . www.phoronix.com .
  26. ^ «Изменения/yescrypt как метод хеширования по умолчанию для теней — Fedora Project Wiki» . libxcrypt: уже способен вычислять хэши Yescrypt, начиная с версии 4.3 .
  27. ^
  28. ^ "passlib.hash.bigcrypt - BigCrypt - Документация Passlib v1.7.1" . Pythonhosted.org . Проверено 2 декабря 2018 г.
  29. ^ "passlib.hash.crypt16 - Crypt16 - Документация Passlib v1.7.1" . Pythonhosted.org . Проверено 2 декабря 2018 г.
  30. ^ abcdefghijkl "Склеп руководства Debian". manpages.debian.org . Проверено 11 января 2022 г.
  31. ^ «Поддержка bcrypt для паролей в /etc/shadow - Портал клиентов Red Hat» . Access.redhat.com . 10 июля 2018 года . Проверено 2 декабря 2018 г.
  32. ^ «хеширование паролей bcrypt («шифрование паролей») для вашего программного обеспечения и ваших серверов» . www.openwall.com .
  33. ^ «crypt_r.c\crypt\src - musl - musl — реализация стандартной библиотеки для систем на базе Linux» . git.musl-libc.org .
  34. ^ «Как Mac OS X реализует аутентификацию по паролю» . Дрибин.орг . 7 апреля 2006 г. Проверено 2 декабря 2018 г.
  35. ^ «Как взломать пароли Mac OS X — Online Hash Crack» . Онлайнhashcrack.com . Проверено 2 декабря 2018 г.

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