ОБСУЖДЕНИЕ

Простая защита паролей пользователей

15 сообщений0 просмотровОткрыта
#1
Здравствуйте друзья. Я начальный программист так сказать),вот создаю свой сайт на php. И задумался о безопасности своих пользователей, а именно паролей. Пароли шифрую двойной md5(md5($password)). Конечно знаю что нужно более надежная шифровка, например с солью. Нужно использовать шифровку в новых версиях php.Но не суть... В общем полазил в интернете и есть вариант шифровки с каким-то дополнительным словом.
Пример:
$password = md5(md5("$password$slovo2"));
Весомый недостаток в таком примере в том что если вдруг сольют базу данных и расшифруют несколько паролей, то можно вычислить это самое слово. Тоже самое если даже и так зашифровать:
$password = md5(md5("$slovo1$password$slovo2"));
И вообщем я подумал, а что если эти самые слова будут различаться (не в том смысле что в начале одно слово, а в конце другое:)), а в том что слова будут например не так часто повторяться. Вот так например:
Сначала нам нужно в таблице user в базе создать два поля num_1, num_2 (для чисел Тип:int.Это для того чтобы знать какое слово в будущем нужно будет подставлять, соответственно num_1 отвечает за слово которое будет подставляться в начале пароля, а num_2 в конце).
Далее в форму вашей регистрации пишим это:
$password = '12345';//Допустим это ваш пароль
$rand_num_1 = rand(1,3); //рандомно числа
$rand_num_2 = rand(4,6);
$s = $rand_number1;//это чтобы знать число которое запишем в базу, для будующего сверения
$z = $rand_number2;//
#Это слова которые отвечают за рандомные числа ($s,$z)
#Подстановка слова в начале пароля
if($s == 1){ //Если число равно 1 тогда это слово и так далее
$slovo1 = 'slovonomer1';
}
if($s == 2){
$slovo1 = 'slovonomer2';
}
if($s == 3){
$slovo1 = 'slovonomer3';
}
#Подстановка слова в конце пароля
if($z == 4){
$slovo2 = 'slovonomer4';
}
if($z == 5){
$slovo2 = 'slovonomer5';
}
if($z == 6){
$slovo2 = 'slovonomer6';
}
Шифруем пароль вместе со словами:
$password_shifr = md5(md5("$slovo1$password$slovo2"));
Далее все это нужно записать в базу данных:
$sql = $pdo->prepare("INSERT INTO `user` SET `num_1` = :num_1, `num_2` = :num_2, `password` = :password");
$sql->execute(array(':num_1' => $s,':num_2' => $z, ':password' => $password_shifr));
Все пароль данные записались. Можно создать больше различных слов, а также можно просто набор букв. И такой зашифрованый пароль будет и тяжелее расшифровать чем '12345', и еще плюс это то что если б эта была соль то она хранилась в базе где хакер её видит и может использовать, а тут в базе разве что просто несколько цифр.
На странице авторизаци напишем:
$email = $_POST['email'];//это то место куда пользователь вводит свой email
$password = $_POST['password'];//это пароль
#Делаем выборку
$sql = $pdo->prepare("SELECT `num_1`, `num_2` FROM `users` WHERE `email` = :email");
$sql->execute(array(':email' => $email));
$us = $sql->fetch();
#По номеру проверяем слово
#это слово в начале
if($us['num_1'] == 1){
$slovo1 = 'slovonomer1';
}
if($us['num_1'] == 2){
$slovo1 = 'slovonomer2';
}
if($us['num_1'] == 3){
$slovo1 = 'slovonomer3';
}
#слово в конце
if($us['num_2'] == 6){
$slovo2 = 'slovonomer4';
}
if($us['num_2'] == 7){
$slovo2 = 'slovonomer5';
}
if($us['num_2'] == 8){
$slovo2 = 'slovonomer6';
}
#Шифруем для свирения
$password_shifr = md5(md5("$slovo1$password$slovo2"));
Ну и дальше у себя пишите для сверения этот пароль $password_shifr. Если все правильно то произойдет авторизация.
Это моя первая статья и я не профи в этом деле так что просто хотелось бы узнать вашу точку зрения. Если статья понравиться то сделаю полноценную статью с страницей авторизации, регистрации и так далее. Это быстро набросал.
#2
Бросай полную статью! Мне как новичку будет интересно)
#3
А кто будет твой сайт взламывать? Есть конкуренты?))
#4
forsim, Нужно всегда думать наперед) И обезопасить себя и других пользователей)
#5
Кстати извините за орфографические ошибки, писал быстро прост. Хотелось узнать ваше мнение о этой защите.
#6
Sm_Klok, Пешы есчо http://php.net/manual/ru/function.crypt.php
#7
CSHARP

public static string HashCode(string myDataEncoded)
{
try
{
SHA1 shA1 = SHA1.Create();
byte[] bytes = new ASCIIEncoding().GetBytes(myDataEncoded);
shA1.ComputeHash(bytes);
myDataEncoded = Convert.ToBase64String(shA1.Hash);
}
catch (Exception ex)
{
string str = "Error in HashCode : " + ex.Message;
}
return myDataEncoded;
}


На коленке.
#8
Sm_Klok, а не проще ли сделать так.
$sault = ид юзера на сайте

далее

sha1(sha512($sault$pass))
тоесть соль это ид юзера на сайте, sha надёжнее чем md5 (говорят)
#9
-=(C)DRU987=-, Можно было б и так, но я теперь лучше буду использовать хеширование паролей для php 5.5, раньше не использовал потому что на Денвере ток 5.3 вот и химичил. Вообщем скачал библиотеку для 5.3 версии, теперь юзаю
#10
З PHP 5.5
password_hash() и password_verify()
На основе crypt()
#11
VITAMIN, crypt() довольно безопасна, она, по мнению многих, слишком сложная.
#12
kainsk, в чем сложная?
#13
Artem, почитай в гугале
#14
kainsk, если ты про хэш, то естественно чем сложней тем лучше в большенствах случаях
#15
Artem, да почитай сам поймешь