Как заставить Perl crypt шифровать более 8 символов?

#perl #crypt

#perl #криптография

Вопрос:

При использовании функции Perl crypt шифруются только первые 8 символов. Есть ли способ заставить его использовать больше символов?

В качестве примера:

 $crypted_password = crypt ("PassWord", "SALT");
 

и

 $crypted_password = crypt ("PassWord123", "SALT");
 

возвращает точно такой же результат. $crypted_password имеет точно такое же значение.

Хотелось бы использовать crypt, потому что это быстрое и простое решение для некоторого необратимого шифрования, но это ограничение не делает его полезным для чего-либо серьезного.

Комментарии:

1. Стандартная crypt(3) функция DES в системах unix (для которой perl crypt является оболочкой) просматривает только первые 8 байтов, да. (Плюс соль состоит всего из двух символов). Если вы хотите повысить безопасность, вы должны использовать что-то другое.

2. Чтобы дать больше источников комментарию от Шона: From perldoc -f crypt : «Создает строку дайджеста, точно такую же, как функция crypt(3) в библиотеке C … » . man 3 crypt : «… Взяв младшие 7 бит каждого из первых восьми символов ключа … » . Таким образом, как он сказал: если вам нужно что-то более безопасное, не используйте crypt .

3. Пессимист во мне сказал бы, что лучше не включать «crypt» в современные дистрибутивы Perl, потому что люди будут читать ввод вручную для «crypt» и пропускать части о том, насколько это безопасно. Машина, которая выходит с завода только с одной панелью блокировки, вероятно, будет очень плохой идеей. Люди любят делать ошибки и печально известны тем, что пропускают биты или «пропускают» важные разделы документов, которые они должны были прочитать… Мои 2 цента.

Ответ №1:

Цитата из документации:

Традиционно результатом является строка из 13 байт: два первых байта соли, за которыми следуют 11 байт из набора [./0-9A-Za-z] , и только первые восемь байтов ОТКРЫТОГО ТЕКСТА имеют значение. Но альтернативные схемы хеширования (например, MD5), схемы безопасности более высокого уровня (например, C2) и реализации на платформах, отличных от Unix, могут создавать разные строки.

Таким образом, точное возвращаемое значение зависит от crypt системы, но часто используется алгоритм, который просматривает только первые 8 байт пароля. Эти две вещи в сочетании делают его плохим выбором для переносимого шифрования паролей. Если вы используете систему с более надежной процедурой шифрования и не пытаетесь проверять эти пароли в несовместимых системах, все в порядке. Но похоже, что вы используете ОС со старой дрянной процедурой DES.

Таким образом, лучшим вариантом является использование модуля вне CPAN, который выполняет шифрование предсказуемым и более безопасным способом.

Некоторый поиск дает несколько перспективных вариантов (которые я не использовал и не могу рекомендовать один над другим; я просто искал многообещающие ключевые слова в metacpan):