Как сделать шифрование паролей в бд php

Обновлено: 08.07.2024

Не рекомендуется хранить пароли пользователей вашего сайта в открытом виде. Если кто-либо завладеет доступом к вашей базе данных, он легко узнает пароли всех пользователей. Лучшим решением будет шифрование пароля необратимыми хеш функциями. Это значит, что функция шифрования преобразует пароль в некую случайную строку, из которой будет не возможно узнать оригинальный пароль.

В PHP имеются две такие хеш функции: md5() и sha1(). Принцип их работы схож, но многие склоняются к выбору sha1(), аргументируя это тем, что MD5 уже несколько раз был скомпрометирован. Я лично разницы в их использовании не вижу. Единственно, что md5() генерирует зашифрованную строку из 32 символов, а sha1() из 40 символов. Рассмотрим принцип действия на примере:

Когда пользователь вводит логин и пароль в форму, мы шифруем введенный пароль и проверяем с зашифрованным оригинальным паролем. Дальнейшая работа скрипта возможна только при совпадении обеих строк. Поэтому при регистрации пользователя, пароль следует шифровать, и хранить уже в зашифрованном виде.

Но обычно пары логин/пароль хранят в базе данных. К тому же здесь отсутствует проверка входящих данных. Поэтому немного изменим наш скрипт аутентификации:

Ну вот, уже лучше. Однако не совсем. Хотя сам md5 или sha1 хеш не поддается простому перебору (брутфорс), в настоящее время растут словари хешей. Многие пользователи используют слишком короткие пароли, что позволяет находить около 30% паролей (по грубым расчетам) по словарям хешей. От этого можно спастись добавлением случайной строки к паролю, что существенно изменит конечный хеш. Это нужно сделать при шифровании и при проверке пароля. Данная практика является рекомендуемой и добавляет определенный уровень безопасности вашим скриптам.

Сама статья и идея интересные, а вот в реализации синтаксические ошибки. strcmp()==0 когда сравниваемые строки равны, да и требует 2 значения, а у автора одно, короче, у меня заработало что-то типа
if(strcmp(md5($new_pass),$array['pass']) == 0)
echo "Пароль введен верно!";
else
echo "Пароль или логин неправильный!";

Спасибо за исправление. Там действительно ошибка. На месте $encrypt должна быть другая переменная. Исправил.

Симметричное шифрование – это алгоритм шифрования, в котором используется один и тот же криптографический ключ как для шифрования, так и для расшифровки данных. Рассмотрим на PHP шифрование данных симметричным методом на основе алгоритма AES (Advanced Encryption Standard) – симметричного алгоритма блочного шифрования (размер блока 128 бит, ключ 128/192/256 бит). AES является одним из самых распространённых алгоритмов симметричного шифрования..

PHP шифрование данных AES

Как уже говорилось ранее, для шифровки и расшифровки потребуется ключ шифрования. Это может быть любая строка, но мы для его получения воспользуемся функцией, которая генерирует строку псевдослучайных байт длиной 40, и преобразуем полученный результат в шестнадцатеричное представление:

На экран будет выведен результат следующего вида:

Полученное значение мы будем использовать как секретный ключ шифрования и дешифрования данных (он должен храниться в тайне). Запишем его в переменную $key:

Теперь определим, что мы будем кодировать. Для первого примера возьмем обычную строку:

Мы будем шифровать данные алгоритмом AES с 192 битным ключом:

Все доступные методы шифрования можно посмотреть следующим образом:

Имея данные для шифрования $data, выбранный метод $method и секретный ключ $key в PHP симметричное шифрование данных мы можем осуществить с помощью функции openssl_encrypt:

Выведем на экран результат с помощью var_dump($encrypted):

Опять воспользуемся var_dump($decrypted):

Конечный листинг примера симметричного шифрования/расшифровки данных на PHP будет следующий:

PHP шифрование файлов AES

В PHP шифрование файлов от шифрования данных отличается лишь тем, что содержимое файла сначала необходимо прочитать, проделать с ним необходимые операции, а затем – записать.

Создадим обычный текстовый файл в текущей директории:

Ключ и метод шифрования мы возьмем из предыдущего примера, а данные для кодирования получим из файла aes.txt с помощью функции file_get_contents:

Закодируем содержимое файла и запишем его в новый файл aes-encrypted.txt с помощью функции file_put_contents:

Посмотрим содержимое полученного файла:

Осталось попробовать расшифровать этот файл и записать его:

Конечный листинг симметричного шифрования файла на PHP алгоритмом AES:

Асимметричное шифрование

Асимметричное шифрование отличается от симметричного тем, что для шифровки и расшифровки данных используется не один общий ключ, а два разных. Одним из самых распространенных алгоритмов асимметричного шифрования является RSA (аббревиатура от фамилий Rivest, Shamir и Adleman) — криптографический алгоритм с открытым ключом. В этом алгоритме для шифрования данных используется публичный ключ, а для расшифровки – секретный приватный ключ.

PHP шифрование данных RSA

Для работы с данным алгоритмом нам понадобятся публичный public.crt и приватный private.pem ключ. Получить их можно из консоли с помощью openssl. Сгенерируем пару rsa с ключом 2048 бит на 365 дней (“/C=RU/ST=MO/L=MOSCOW/O=POCKETADMIN/TECH=XX/CN=pocketadmin.tech/emailAddress=”example@pocketadmin.tech – информация о субъекте, который выпустил ключ):

Ещё раз хочу обратить внимание, что сам приватный ключ необходимо хранить в тайне! Непосредственно для шифрования третьим лицам достаточно передать только публичный ключ.

Получаем содержимое файла с публичным ключом и извлекаем сам ключ:

С помощью функции openssl_public_encrypt шифруем данные $data публичным ключом $publicKey. Результат шифрования будет помещен в переменную $encrypted:

В дальнейшем, для расшифровки нам понадобится приватный ключ:

Чтобы расшифровать данные $encrypted приватным ключом $privateKey воспользуемся функцией openssl_private_decrypt. Результат помещается в переменную $decrypted:

Проверим результат с помощью var_dump($decrypted):

Приведем весь код на PHP шифрования данных алгоритмом RSA:

PHP шифрование файлов RSA

Создадим простой текстовый файл, который мы будем шифровать:

Используем публичный и приватный ключ из предыдущего примера. Объявим шифруемый файл, шифрованный и расшифрованный:

По аналогии с предыдущими примерами: получаем публичный ключ $publicKey и с помощью него шифруем содержание файла $file. Результат записываем в $fileEncrypted:

Чтобы расшифровать этот файл: получаем приватный ключ $privateKey, расшифровываем содержимое файла $fileEncrypted. Данные записываем в файл $fileDecrypted:

MD5 хэширование в PHP

В этой статье я решил затронуть тему MD5 хэширования, так как тема эта очень простая, интересная и очень-очень важная. Самый простой пример использования MD5 хэша - это шифрование паролей пользователей. Ведь не секрет, что если хранить пароли в открытом виде в базе данных, то при её утере, все пароли пользователей будут украдены, чего не имеет никакого морального права допустить администратор. И вот тут на помощь приходит функция хэширования в PHP.

Функция MD5 хэширования в PHP называется md5(). Принимает функция одну строку, которую необходимо зашифровать. Функция возвращает MD5 хэш:

Запустив данный скрипт, Вы увидите MD5-хэш, соответствующий строке "MyPassword".

То есть простейший скрипт проверки логина и пароля:

Теперь если Вы пройдёте по ссылке: "http://путь_к_скрипту.php?login=Admin&password=MyPassword", то увидите: "Welcome!".

Теперь поговорим о свойствах MD5-хэширования.

  1. MD5-хэш содержит 32 символа
  2. MD5-хэш уникален для каждой строки
  3. Процесс MD5-хэширования необратим
  4. Процесс MD5-хэширования достаточно медлителен

Третий пункт, пожалуй, самый важный, потому что если бы он был обратим, то смысл хэширования практически бы отсутствовал. Глупо шифровать, например, пароли, если их можно легко потом расшифровать.

Четвёртый пункт, как бы это парадоксально не звучало, также является очень большим плюсом. Почему? Очень просто: человек, который будет вынужден подождать этот процесс 0.001 секунды, сильно не пострадает. А вот злоумышленник, который будет перебирать пароли пострадает резко, так как медлительность алгоритма уже задаёт предел - 1000 паролей в секунду. Хотя, безусловно, скорость зависит от быстродействия сервера. Но тем не менее, для злоумышленника низкая скорость получения MD5-хэша - это очень большая проблема.

На будущее: никогда не храните пароли в открытом виде, забудьте об этом раз и навсегда. Поэтому всегда отправляйте пароли в базу данных в виде MD5-хэша, и, соответственно, сравнивайте хэши паролей, а не сами пароли.


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 6 ):

А у меня такой вопрос: не могу сообразить как сделать напоминание пароля, если он хранится в md5. То есть я понимаю что нужно сделать как у вас на сайте, чтобы выдавалась одноразовая ссылка на изменение пароля, но как ее сгенерировать?

Можно просто генерировать новый пароль и его присылать. А что касается ссылки, то это тоже несложно. Достаточно сгенерировать какой-нибудь ключ на основании, например, бывшего пароля и затем проверить этот ключ. Если верный, то предложить сменить пароль.

Михаил, а ведь сейчас можно расшифровать md5 !

Нет, Антон. Расшифровать невозможно. Возможно только сбрутить хэш.

Михаил, у меня возникла вот такая проблема: у меня регистрация пользователей проходит в одном файле, вход в другом. при регистрации пользовательский пароль уходит к примеру в текстовый файл в виде хэша, то есть в md5, потом пользователь хочет войти на сайт и естественно вводит пароль и логин, но при обработке полученных данных, если я сравниваю md5 хэш введённого пользователем пароля и тот пароль, что хранится в файле, то они не равны. И я уже это проверил. зарегистрировал пользователя, затем посмотрел в файле его пароль в виде хэша, далее сделал такой скрипт, чтобы пользователь вводил пароль, и чтобы этот пароль вывелся в браузер в виде хэша, так вот они разные. в чём может быть проблема?

Всем привет и здрасте!
Научите передавать в бд зашифрованные пароли.
Я так понимаю, для шифрования пароля надо создать переменную, в которую будет передаваться инфа из $_POST['passwords']. И уже эту переменную мы и шифруем, так?

Зашифровать пароль
Добрый вечер. Возник вопрос. Не могу найти на него ответ. Помогите, кто может. Есть таблица в бд.

зашифровать пароль
добрый вечер. есть функция шифрования методом гаммирования function proc_encr(s_source, s_gamma.


Зашифровать пароль
Добрый день! Искал, но точно этого не нашел. ( Задача сделать форму входа, то есть авторизацию.

Как зашифровать пароль?
Народ, привет. Есть окна регистрации и авторизации, при регистрации пароль должен шифроваться и.

Без разницы, что $password, что $_POST['password'].

Хм. вроде все просто - всего одна строчка - а я не понимаю
Ведь пароль должен шифроваться в тот момент, когда уже появился в БД?
Т.е

Jodah, я бы выкинул, но в моем денвере стоит эта версия.
Либо найду бесплатный хост с пхп7 либо научусь ставить отдельно php,mysql,apach

EK, ну 7 не обязательно, далеко не везде она есть (тем более бесплатно).

OpenServer. Бесплатный, простой в управлении. После запуска нужно будет в настройках выбрать PHP 5.6 + Apache 2.4. Только качать придётся с торрентов (либо с офф сайта за небольшое пожертвование).

Итак, в современном пхп есть следующие варианта шифрования паролей: base64_encode, bcrypt,
password_hush и md5, который, как пишут, не рекомендуется.
Какой вариант предпочитают опытные пхпэшеники, которые делают серьезные сайты?

думаю только base64_encode
однако я считаю что шифровать пароли смысла нет. надо хешировать

WhiteMind, а Вы не могли бы популярно объяснить, чем отличается хеширование от шифрования? Никак не могу найти инфу об этом

Как зашифровать пароль?
Есть база с данными мне нужно зашифровать пароль с последующим его изменением. Если какой нибудь.


Как зашифровать пароль в md5 на сайте?
Как зашифровать пароль в md5 на сайте Куда это прописиваеться? if ($password == $cpassword)

Как зашифровать пароль в методе действия?
Например в MD5 public ActionResult Register(UserAccount account) < .

Читайте также: