crypt - это функция библиотеки POSIX C. Обычно он используется для вычисления хэша паролей учетных записей пользователей. Функция выводит текстовую строку, которая также кодирует соль (обычно первые два символа - это сама соль, а остальные - результат хеширования) и идентифицирует используемый алгоритм хеширования (по умолчанию к «традиционному», объясненному ниже). Эта строка вывода формирует запись пароля, которая обычно хранится в текстовом файле.
Более формально crypt предоставляет функции криптографического получения ключа для проверки и хранения пароля в системах Unix.
В Unix есть несвязанная утилита crypt, которую часто путают с функцией библиотеки C. Чтобы различать их, авторы часто называют служебную программу crypt (1), потому что она задокументирована в разделе 1 страниц руководства Unix , и ссылаются на библиотеку C. функция как crypt (3), потому что ее документация находится в разделе 3 руководства.
Эта же функция crypt используется как для генерации нового хэша для хранения, так и также хешировать предложенный пароль с записанной солью для сравнения.
Современные Unix-реализации подпрограммы библиотеки crypt поддерживают множество хэш-схем. Конкретный используемый алгоритм хеширования может быть идентифицирован по уникальному префиксу кода в результирующем хэш-тексте в соответствии с фактическим стандартом, называемым Modular Crypt Format.
Библиотечная функция crypt ()
также включена в языки программирования Perl, PHP, Pike, Python и Ruby.
Со временем были введены различные алгоритмы. Чтобы включить обратную совместимость, каждая схема начиналась с использования некоторого соглашения о сериализации хэшей паролей, которое позже было названо Modular Crypt Format (MCF). Старые хэши crypt (3), сгенерированные до де-факто стандарта MCF, могут отличаться от схемы к схеме. Четко определенное подмножество формата Modular Crypt было создано во время конкурса хеширования паролей. Формат определяется как:
$
где
id
: идентификатор, представляющий алгоритм хеширования (например, 1 для MD5, 5 для SHA-256 и т. Д.)param
name и его value
: параметры сложности хэша, такие как количество раундов / итерацийsalt
: Base64 в кодировке salt hash
: Base64 -подобный результат хеширования пароля и солиScheme id | Schema | Пример |
---|---|---|
DES | Kyq4bCxAXJkbg | |
_ | BSDi | _EQ0.jzhSVeUyoSqLupI |
1 | MD5 | $ 1 $ etNnh7FA $ OlM7eljE / B7F1J4XYNnk81 |
2, 2, 2, 2, 2, 2, 2 222>Bcrypt | $ 2a $ 10 $ VIhIOofSMqgdGlL4wzE // e.77dAQGqntF / 1dT7bqCrVtquInWy2qi | |
3 | NTHash | $ 3 $$ 8846f7eaee8fb117ad06bdd830b7586c |
5 | ША-256 | $ 5 $ 9ks3nNEqv31FX.F $ gdEoLFsCRsn / WRN3wxUnzfeZLoooVlzeF4WjLomTRFD |
6 | SHA-512 | $ 6 $ qoE2letU $ wWPRl.PVczjzeMVgjiA8LLy2nOyZbf7Amj3qLIL978o18gbMySdKZ7uepq9tmMQXxyTIrS12Pln.2Q / 6Xscao0 |
md5 | Solaris MD5 | $ md5, раунды = 5000 $ GUBv0xjJ $$ mSwgIswdjlTY0YxV7HBVm0 |
SHA1 | ПБК DF1 с SHA-1 | $ sha1 $ 40000 $ jtNX3nZ2 $ hBNaIXkt4wBI2o5rsi8KejSjNqIq |
Подмножество PHC охватывает большинство хешей MCF. Существует ряд дополнительных методов, определяемых приложением.
Исходная реализация библиотечной функции crypt () в Третьей редакции Unix имитировал шифровальную машину М-209. Вместо того, чтобы зашифровать пароль с помощью ключа, который позволил бы восстановить пароль из зашифрованного значения и ключа, он использовал сам пароль в качестве ключа, а база данных паролей содержала результат шифрования пароля с помощью этого ключа.
Исходная схема шифрования паролей оказалась слишком быстрой и, таким образом, подвержена перебору наиболее вероятных паролей. В седьмом издании 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 расширил соль до 24 бит и сделал количество раундов переменным (до 2-1). Выбранное количество раундов закодировано в сохраненном хэше пароля, что позволяет избежать несовместимости, которая возникла, когда сайты изменили количество раундов, используемых исходной схемой. Эти хэши обозначаются знаком подчеркивания (_
), за которым следуют 4 байта, представляющие количество раундов.
Алгоритм BSDi также поддерживает более длинные пароли, используя DES для сокращения начального длинного пароля до восьми 7-битных байтов, поддерживаемых исходным алгоритмом.
Пол-Хеннинг Камп разработал необычный и (в то время) дорогостоящий в вычислительном отношении алгоритм, основанный на алгоритме дайджеста сообщения MD5. Сам по себе MD5 обеспечит хорошую криптографическую стойкость для хэша пароля, но он спроектирован таким образом, чтобы его можно было довольно быстро вычислить в зависимости от предоставляемой силы. Схема crypt () спроектирована так, чтобы ее было сложно вычислить, чтобы замедлить словарные атаки. Печатная форма хэшей паролей MD5 начинается с $ 1 $
.
. Эта схема позволяет пользователям иметь пароль любой длины, и они могут использовать любые символы, поддерживаемые их платформой (а не только 7-битный ASCII). (На практике многие реализации ограничивают длину пароля, но обычно они поддерживают пароли намного дольше, чем кто-либо захочет ввести.) Соль - это также произвольная строка, ограниченная только соображениями набора символов.
Сначала парольная фраза и соль хешируются вместе, в результате получается дайджест сообщения MD5. Затем создается новый дайджест, объединяющий парольную фразу, соль и первый дайджест в довольно сложной форме. Затем этот дайджест проходит через тысячу итераций функции, которая повторно хеширует его вместе с парольной фразой и солью в манере, которая меняется от раунда. Результатом последнего из этих циклов является полученный хэш ключевой фразы.
Фиксированное количество итераций привело к тому, что эта схема потеряла вычислительные затраты, которыми она когда-то пользовалась, и теперь предпочтение отдается переменному количеству раундов. В июне 2012 года Пол-Хеннинг Камп объявил алгоритм небезопасным и призвал пользователей перейти на более надежные скремблеры паролей.
Нильс Провос и разработал схему 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...
FreeBSD реализовала поддержку алгоритма хеширования NT LAN Manager для обеспечения более простой совместимости с учетными записями NT через MS- ЧАП. Алгоритм NT-Hash известен как слабый, так как он использует устаревший алгоритм хеширования md4 без какого-либо соления. FreeBSD использовала для этого префикс $ 3 $
. Его использование не рекомендуется, так как оно легко взломано.
Широко используемую схему на основе MD5 стало легче атаковать по мере увеличения мощности компьютера. Хотя система на основе Blowfish имеет возможность добавления раундов и, таким образом, остается сложным алгоритмом пароля, она не использует алгоритм, одобренный NIST. В свете этих фактов в Red Hat была предпринята попытка создать схему, основанную на хэш-функциях SHA-2 (SHA-256 и SHA-512). Форма для печати этих хэшей начинается с $ 5 $
(для SHA-256) или $ 6 $
(для SHA-512) в зависимости от того, какой вариант SHA используется. Его конструкция аналогична крипте на основе MD5, с некоторыми заметными отличиями:
Спецификация и образец кода были выпущены в общественное достояние; его часто называют «SHAcrypt».
Идентификатор схемы | Схема | Linux (glibc ) | FreeBSD | NetBSD | OpenBSD | Solaris | MacOS |
---|---|---|---|---|---|---|---|
DES | Да | Да | Да | Да | Да | Да | |
_ | BSDi | Нет | Да | Да | Да | Нет | Да |
1 | MD5 | Да | Да | Да | Да | Да | Нет |
2, 2a, 2x, 2y | bcrypt | Нет | Да | Да | Да | Да | Нет |
3 | NTHASH | Нет | Да | Нет | Нет | Нет | Нет |
5 | SHA-256 | 2.7+ | 8.3+ | Нет | Нет | Да | Нет |
6 | SHA-512 | 2.7+ | 8.3+ | Нет | Нет | Да | Нет |
md5 | Solaris MD5 | Нет | Нет | Нет | Нет | Да | Нет |
sha1 | PBKDF1 с SHA1 | Нет | Нет | Да | Нет | Нет | Нет |
BigCrypt - это модифицированная версия DES-Crypt, используемая в HP-UX, Digital Unix и OSF / 1. Основное различие между ним и DES заключается в том, что BigCrypt использует все символы пароля, а не только первые 8, и имеет хэш переменной длины.
Crypt16 - это небольшая модификация DES, которая позволяет использовать пароли до до 16 знаков. Используется в Ultrix и Tru64.
Библиотека 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.
родной Darwin crypt ()
обеспечивает ограниченную функциональность, поддерживающий только DES и BSDi. OS X использует несколько систем для собственных хэшей паролей, от старого NeXTStep netinfo до новой системы служб каталогов (ds).