crypt (C) - crypt (C)

редактировать

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

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

Содержание
  • 1 Связь с утилитой Unix crypt
  • 2 Подробности
  • 3 Функции вывода ключей, поддерживаемые crypt
    • 3.1 Исходная реализация с использованием пароля в качестве ключа
    • 3.2 Традиционная схема на основе DES
      • 3.2.1 Слабые стороны традиционной схемы
    • 3.3 BSDi расширенная схема на основе DES
    • 3.4 Схема на основе MD5
    • 3.5 Схема на основе Blowfish
    • 3.6 Схема хеширования NT
    • 3.7 на основе SHA2 схема
  • 4 Поддержка в операционных системах
    • 4.1 Архаические схемы Unix
    • 4.2 GNU / Linux
    • 4.3 macOS
  • 5 См. также
  • 6 Ссылки
  • 7 Внешние ссылки
Связь с Утилита Unix crypt

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

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

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

Библиотечная функция crypt ()также включена в языки программирования Perl, PHP, Pike, Python и Ruby.

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

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

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

где

  • id: идентификатор, представляющий алгоритм хеширования (например, 1 для MD5, 5 для SHA-256 и т. Д.)
  • paramname и его value: параметры сложности хэша, такие как количество раундов / итераций
  • salt: Base64 в кодировке salt
  • hash: Base64 -подобный результат хеширования пароля и соли
Scheme idSchemaПример
DES Kyq4bCxAXJkbg
_BSDi _EQ0.jzhSVeUyoSqLupI
1MD5$ 1 $ etNnh7FA $ OlM7eljE / B7F1J4XYNnk81
2, 2, 2, 2, 2, 2, 2 222>Bcrypt $ 2a $ 10 $ VIhIOofSMqgdGlL4wzE // e.77dAQGqntF / 1dT7bqCrVtquInWy2qi
3NTHash $ 3 $$ 8846f7eaee8fb117ad06bdd830b7586c
5ША-256 $ 5 $ 9ks3nNEqv31FX.F $ gdEoLFsCRsn / WRN3wxUnzfeZLoooVlzeF4WjLomTRFD
6SHA-512 $ 6 $ qoE2letU $ wWPRl.PVczjzeMVgjiA8LLy2nOyZbf7Amj3qLIL978o18gbMySdKZ7uepq9tmMQXxyTIrS12Pln.2Q / 6Xscao0
md5Solaris MD5$ md5, раунды = 5000 $ GUBv0xjJ $$ mSwgIswdjlTY0YxV7HBVm0
SHA1ПБК DF1 с SHA-1 $ sha1 $ 40000 $ jtNX3nZ2 $ hBNaIXkt4wBI2o5rsi8KejSjNqIq

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

Исходная реализация с использованием пароля в качестве ключа

Исходная реализация библиотечной функции crypt () в Третьей редакции Unix имитировал шифровальную машину М-209. Вместо того, чтобы зашифровать пароль с помощью ключа, который позволил бы восстановить пароль из зашифрованного значения и ключа, он использовал сам пароль в качестве ключа, а база данных паролей содержала результат шифрования пароля с помощью этого ключа.

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

Исходная схема шифрования паролей оказалась слишком быстрой и, таким образом, подвержена перебору наиболее вероятных паролей. В седьмом издании Unix схема была изменена на модифицированную форму алгоритма 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-1). Выбранное количество раундов закодировано в сохраненном хэше пароля, что позволяет избежать несовместимости, которая возникла, когда сайты изменили количество раундов, используемых исходной схемой. Эти хэши обозначаются знаком подчеркивания (_), за которым следуют 4 байта, представляющие количество раундов.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Он избегает добавления постоянных данных за несколько шагов.
  • Алгоритм MD5 будет многократно добавлять первую букву пароля; этот шаг был значительно изменен.
  • Вдохновленный реализацией Sun crypt (), была добавлена ​​функция определения количества итераций (раундов), выполняемых основным циклом в алгоритме

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

Поддержка в операционных системах
Идентификатор схемыСхемаLinux (glibc )FreeBSDNetBSDOpenBSDSolarisMacOS
DESДаДаДаДаДаДа
_BSDiНетДаДаДаНетДа
1MD5ДаДаДаДаДаНет
2, 2a, 2x, 2ybcryptНетДаДаДаДаНет
3NTHASHНетДаНетНетНетНет
5SHA-2562.7+8.3+НетНетДаНет
6SHA-5122.7+8.3+НетНетДаНет
md5Solaris MD5НетНетНетНетДаНет
sha1PBKDF1 с SHA1НетНетДаНетНетНет

Ar chaic схемы Unix

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

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

GNU / Linux

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

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

macOS

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

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-16 10:18:15
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте