December 26th, 2009

Шифрование паролей

Думаю, не надо объяснять всю важность шифрование паролей, поэтому перейду сразу к делу.
По поводу шифрования есть хорошая статья на Викпедии:

------------------------------------------------------

Примеры использования

MD5 позволяет получать относительно надёжный идентификатор для блока данных. Такое свойство алгоритма широко применяется в разных областях. Оно позволяет искать дублирующиеся файлы на компьютере, сравнивая MD5 файлов, а не их содержимое. Как пример, dupliFinder - графическая программа под Windows и Linux. Такой же поиск может работать и в интернете.

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

MD5 используется для хеширования паролей. В системе UNIX каждый пользователь имеет свой пароль и его знает только пользователь. Для защиты паролей используется хеширование. Получить настоящий пароль можно только полным перебором. При появлении UNIX единственным способом хеширования был DES (Data Encryption Standard), но им могли пользоваться только жители США, потому что исходные коды DES нельзя было вывозить из страны. Во FreeBSD решили эту проблему. Пользователи США могли использовать библиотеку DES, а остальные пользователи имеют метод, разрешённый для экспорта. Поэтому в FreeBSD стали использовать MD5 по умолчанию.

Многие системы используют базу данных для хранения паролей и существует несколько способов для хранения паролей.

  1. Пароли хранятся как есть. При взломе такой базы все пароли станут известны.
  2. Хранятся только хеши паролей (с помощью MD5, SHA). Найти пароли можно только полным перебором. Но сейчас такая задача решается за доли секунды. Пароль из таблицы был найден всего за 0,036059 сек.
  3. Хранятся хеши паролей и несколько случайных символов. К каждому паролю добавляется несколько случайных символов (их ещё называют "salt" или "соль") и результат ещё раз хешируется. Например, md5(md5(pass)+word). Найти пароль с помощью таблиц таким методом не получится.
Пример базы данных
способ id login password
1 5 anton mydata
2 5 anton md5(mydata)
3 5 anton md5(md5(mydata)+word) и word

------------------------------------------------------

От себя хочу добавить, что имеет смысл к хешированию по MD5 добавить еще и хеширование по sha-1. Т.е. пример приведенный выше примет такой вид: sha-1(md5(md5(mydata)+word)).
На практике часто имеет смысл подмешать в эту формулу еще имя пользователя.

И пара слов о практическом применении хеширования.
В php и MySQL есть встроенные функции md5('String') и sha1('String').
На php предложенная формула будет выглядеть так:
sha1(md5(md5('mydata').'word')).

Петрелевич Сергей
petrelevich@yandex.ru
www.SmartyIT.ru