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
-
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).