crypt(3) шифрует пароль и данные

Other Alias

crypt_r

ОБЗОР

#define _XOPEN_SOURCE /* Смотрите feature_test_macros(7) */
#include <unistd.h>


char *crypt(const char *key, const char *salt);

#define _GNU_SOURCE /* Смотрите feature_test_macros(7) */
#include <crypt.h>

char *crypt_r(const char *key, const char *salt,
struct crypt_data *data);

Компонуется при указании параметра -lcrypt.

ОПИСАНИЕ

crypt() — функция шифрования пароля. Она основана на алгоритме стандарта шифрования данных (Data Encryption Standard) с различными расширениями, нацеленными (помимо прочего) на усложнение задачи поиска ключа при помощи специального оборудования.

key — задаваемый пользователем пароль.

salt (соль) — двухсимвольная строка, выбираемая из набора [a-zA-Z0-9./]. Эта строка используется для направления алгоритма по одному из 4096-и путей.

Если взять младшие 7 битов каждого из первых 8 символов key, то получается 56-битный ключ. Этот ключ используется для многократного шифрования константной строки (обычно строки, состоящей из символов «0»). Возвращаемое значение — указатель на зашифрованный пароль, серия из 13-и печатных ASCII-символов (первые два символа содержат salt). Возвращаемое значение указывает на статические данные, которые перезаписываются при каждом вызове.

Предупреждение: количество ключей равно 2**56 т. е. существует 7.2e16 возможных вариантов. Полный перебор этого множестве возможен с помощью большого количества параллельных компьютеров. Программное обеспечение, такое, как crack(1), способно отыскать часть ключей из этого множества, обычно используемых людьми для создания пароля. Поэтому в качестве пароля не стоит, как минимум, использовать простые слова и имена. Рекомендуется использовать программу passwd(1), которая проверяет сложность пароля уже на стадии ввода.

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

Функция crypt_r() является реентерабельной версией crypt(). Для учёта и хранения результата в ней используется структура, на которую указывает data. Перед первым вызовом crypt_r() требуется выделить место под структуру и присвоить data->initialized значение 0.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении возвращает указатель на шифрованный пароль. При ошибке возвращается NULL.

ОШИБКИ

EINVAL
Значение salt имеет неверный формат.
ENOSYS
Функция crypt() не реализована, возможно, из-за запретов США на экспорт алгоритмов шифрования.
EPERM
Значение /proc/sys/crypto/fips_enabled не равно нулю, но делается попытка использовать нестойкий тип шифрования, такой как DES.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).
ИнтерфейсАтрибутЗначение
crypt() безвредность в нитяхнебезопасно (MT-Unsafe race:crypt)
crypt_r() безвредность в нитяхбезвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

crypt(): POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD. Функция crypt_r() является расширением GNU.

ЗАМЕЧАНИЯ

Замечания по glibc

Версия этой функции, реализованная в glibc2, имеет следующие дополнительные алгоритмы шифрования.

Если salt является строкой символов, начинающейся с «$id$», за которой следует строка, оканчивающаяся «$»:

$id$salt$encrypted

то, вместо использования машины DES, используется метод, задаваемый id, а оставшаяся часть считается строкой пароля. Поддерживаются следующие значения id:
ID | Метод

1 | MD5
2a | Blowfish (нет в основной ветви glibc; добавлен в

    | некоторых дистрибутивах Linux)

5 | SHA-256 (начиная с glibc 2.7)
6 | SHA-512 (начиная с glibc 2.7)

Здесь $5$salt$encrypted — шифрованный по SHA-256 пароль, а $6$salt$encrypted шифрованный по SHA-512 пароль.

«salt» представляет собой строку длиной до 16 символов, следующую после «$id$» в соли. Шифрованная часть строки пароля — действительно вычисленный пароль. Размер этой строки постоянного размера:

MD5 | 22 символа
SHA-256 | 43 символа
SHA-512 | 86 символов

Символы в «salt» и «encrypted» входят в диапазон [a-zA-Z0-9./]. В реализациях MD5 и SHA учитывается всё значение key (а не только первые 8 байт как в DES).