Здравствуйте друзья. Я начальный программист так сказать),вот создаю свой сайт на 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. Если все правильно то произойдет авторизация.
Это моя первая статья и я не профи в этом деле так что просто хотелось бы узнать вашу точку зрения. Если статья понравиться то сделаю полноценную статью с страницей авторизации, регистрации и так далее. Это быстро набросал.
Пример:
$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. Если все правильно то произойдет авторизация.
Это моя первая статья и я не профи в этом деле так что просто хотелось бы узнать вашу точку зрения. Если статья понравиться то сделаю полноценную статью с страницей авторизации, регистрации и так далее. Это быстро набросал.