Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Шифрование паролей
Независимо от того, где хранятся пароли — в базе данных или в файле — хранение паролей в виде простого текста сопряжено с неоправданным риском. Однонаправленный алгоритм кэширования обеспечит дополнительную защиту при незначительных дополнительных затратах. PHP-функция crypt() представляет собой однонаправленную криптографическую кэш-функцию. Прототип этой функции таков: string crypt (string str[, string salt]) Получив на входе строку str, эта функция возвращает псевдослучайную строку. Например, если передать в функцию строку " pass" и аргумент salt равный " хх", то cryptO вернет строку " xxkTlmYjIikoII". Эта строка не может быть дешифрована и пре- вращена обратно в " pass" даже ее создателем, поэтому на первый взгляд строка может и не показаться столь уж полезной. Что делает функцию сгурЮ полезной, так это то, что результат этой функции детерминирован. При каждом вызове с одними и теми же параметрами str и salt эта функция будет возвращать один и тот же результат. Вместо PHP-кода, такого как if($username == " user" & & $password == " pass") { // Пароль совпадает } можно воспользоваться таким кодом if($username = 'user' & & crypt($password, 'хх') == 'xxkTlmYjIikoII') { // Пароль совпадает Нам не требуется знать, как выглядела строка " xxkTlmYjlikoII" перед использованием функции crypt(). Необходимо только знать, совпадает ли введенный пароль с тем паролем, для которого применялась функция crypt(). Как уже упоминалось, жесткое кодирование правильных имен и паролей посетителей — плохая идея. Для этого следует организовать отдельный файл или базу данных. Если для хранения данных аутентификации используется база данных MySQL, можно воспользоваться PHP-функцией crypt() или MySQL-функцией PASSWORDO. Результат этих функций не совпадает, но они имеют одно предназначение. Обе функции — crypt() и PASSWORDO — получают строку как аргумент и применяют к полученной строке необращаемый алгоритм кэширования. Чтобы задействовать функцию PASSWORDO в листинге 2.1 запрос SQL следует переписать так: select count(*) from auth where name = ' $name' and pass = password('$password') Этот запрос посчитает количество строк в таблице auth, в которых значение поля name совпадает с содержимым переменной Sname и значение поля pass совпадает с результатом функции PASSWORDO, примененной к значению переменной Spassword Учитывая, что мы заставляем посетителей выбирать уникальные имена, результатом запроса может быть 0 или 1.
|