Автор Тема: Осоляване на парола в регистрационна система  (Прочетена 3250 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
Здравейте. Имам една Register/Login система и искам да осоля паролата(Salt) или да я криптирам по друг начин и въпроса ми е как става това и после как потребителя да се логне с тази парола.
Пробвах следния метод на осоляване:

<?php

$salt 
mcrypt_create_iv(22MCRYPT_DEV_URANDOM);
$salt base64_encode($salt);
$salt str_replace('+''.'$salt);
$hash crypt('rasmuslerdorf''$2y$10$'.$salt.'$');

echo 
$hash;

?>

Добре , кода работи осолява я вкарва я осолената парола но после като се опитам да вляза с паролата през логин-а не ме вкарва защо се получава така ?

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 269
  • Публикации: 2595
  • meow
Криптираш с password_hash.
Сравняваш с password_verify.

Бързо, лесно, силно.
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
Пробвах с първия вариант на password_hash но ми иска стринг като първи параметър а аз искам да е свойство. Как да го направя? Кода е процедурен м\у другото. И дори да стане как логина да вземе осолената парола?

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 269
  • Публикации: 2595
  • meow
Ъъъ как така "иска стринг като първи параметър а аз искам да е свойство"? Като трети параметър на password_hash може да добавиш масив, с който да подадеш собствен salt, но това го махнаха в PHP7, пък и функцията си генерира достатъчно добър такъв и няма нужда да се тревожиш за това. С password_verify проверяваш дали даден низ (първи параметър), отговаря на даден хеш (втори параметър - вече криптираната парола).
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
Аз съм на php7 и така.
Пробвах първия пример получи се аз съм объркал просто в бързината и съм написал $password_hash() вместо password_hash() и така.
Добре в кода за регистрацията ми е така:
<?php
$hashed_password 
password_hash($passwordPASSWORD_DEFAULT);
if (
password_verify($password$hashed_password)) {
echo 
'Password is valid';
} else {
echo 
'Invalid password';
}

Работи , осолява паролата и така. Сега искам да разбера как логина да взима паролата и да ме вкарва в системата?

« Последна редакция: 13 Юни 2016, 15:52:09 от Darnel »

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 269
  • Публикации: 2595
  • meow
Как така да взима паролата? Тия функции са еднопосочни само - няма (лесен) начин да разбереш каква е била оригиналната парола. Идеята е да провериш дали като криптираш въведени стринг, ще се получи същия хеш (вече криптираната парола). Щом password_verify върне true, значи може да преминеш към логването.
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
Как така да взима паролата? Тия функции са еднопосочни само - няма (лесен) начин да разбереш каква е била оригиналната парола. Идеята е да провериш дали като криптираш въведени стринг, ще се получи същия хеш (вече криптираната парола). Щом password_verify върне true, значи може да преминеш към логването.
То хубаво ама аз хеша го правя в регистрацията. Т.е проверката password_verify трябва да е в логина така ли?

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 120
  • -Получени: 73
  • Публикации: 995
  • Кибик
password_hash - В регистрация
password_verify - В логин
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
Нещо не ми се получава. Не знам как точно да направя верификацията на паролата в логин-а.
Ще предоставя логина и регистъра за добиване на по-добра представа за кода:

SignIn.php
Код: PHP
  1. <?php
  2. include('Global/global.inc.php');
  3.  
  4. if(isset($_SESSION['user_name'])!='') {
  5.     header("Location: index.php");
  6. }
  7.  
  8. include('Global/view/view.login.php');
  9.  
  10. //check if form is submitted
  11. if (isset($_POST['signin'])) {
  12.  
  13.     $user_name = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_name']));
  14.     $user_pass = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_pass']));
  15.     $result = mysqli_query($connect, "SELECT * FROM `".USERS_TABLE."` WHERE user_name = '$user_name' AND user_pass = '".md5($user_pass)."'");
  16.  
  17.     if ($row = mysqli_fetch_array($result)) {
  18.         $_SESSION['user_id'] = $row['user_id'];
  19.         $_SESSION['user_name'] = $row['user_name'];
  20.         $_SESSION['user_avatar'] = $row['user_avatar'];
  21.         $_SESSION['user_mail'] = $row['user_mail'];
  22.         header("Location: index.php");
  23.     }
  24.     if (empty($user_name) && empty($user_pass)) {
  25.         echo 'Invalid username or/and password';
  26.     }
  27.     else {
  28.         echo 'Invalid Username or Password!';
  29.     }
  30. }
  31.  

SignUp.php
Код: PHP
  1. <?php
  2. include('Global/global.inc.php');
  3.  
  4. if (isset($_SESSION['user_name'])) {
  5.     header("Location: index.php");
  6. }
  7.  
  8. include('Global/View/view.register.php');
  9.    
  10. //Set error as false
  11. $error = FALSE;
  12.    
  13. //Check if signup form is send
  14. if (isset($_POST['signup'])) {
  15.     $user_name = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_name']));
  16.     $user_pass = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_pass']));
  17.     $hashed_pass = password_hash($user_pass, PASSWORD_DEFAULT);
  18.     $user_repass = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_repass']));
  19.     $user_mail = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_mail']));
  20.     $user_avatar = mysqli_real_escape_string($connect, htmlspecialchars($_POST['user_avatar']));
  21.    
  22.     //Check if username is already in use
  23.     $user_check = mysqli_query($connect, "SELECT user_name FROM ".USERS_TABLE." WHERE user_name='$user_name'");
  24.     $do_user_check = mysqli_num_rows($user_check);
  25.  
  26.     //If email is already in use
  27.     $email_check = mysqli_query($connect, "SELECT user_mail FROM ".USERS_TABLE." WHERE user_mail='$user_mail'");
  28.     $do_email_check = mysqli_num_rows($email_check);
  29.  
  30.     //Display Errors
  31.     if($do_user_check > 0){
  32.         echo '<font color=\'red\'>Username is already in use!</font><br />';
  33.     }
  34.  
  35.     //Checking username lenght
  36.     if (mb_strlen($user_name, 'UTF-8') < 6 || mb_strlen($user_name, 'UTF-8') > 100) {
  37.         $error = TRUE;
  38.             echo '<font color=\'#FF0000\'>Username must be minimum of <b>6</b> and maximum of <b>100</b> characters</font><br />';
  39.     }
  40.  
  41.     if($do_email_check > 0){
  42.         echo '<font color=\'red\'>Email is already in use!</font><br />';
  43.     } else {
  44.        
  45.         //Username can contain only alpha character and space
  46.         if (!preg_match("/^[a-zA-Z0-9]+$/", $user_name)){
  47.             $error = TRUE;
  48.                 echo '<font color=\'#FF0000\'>Name must be only with alphabets and space</font><br />';
  49.         }
  50.  
  51.         //Check email is valid
  52.         if (!filter_var($user_mail, FILTER_VALIDATE_EMAIL)) {
  53.             $error = TRUE;
  54.                 echo '<font color=\'#FF0000\'>Invalid Email Adress. Please enter a valid email adress</font><br >';
  55.         }
  56.            
  57.         //Checking password lenght
  58.         if (mb_strlen($user_pass, 'UTF-8') < 6 || mb_strlen($user_pass, 'UTF-8') > 250) {
  59.             $error = TRUE;
  60.                 echo '<font color=\'#FF0000\'>Password must be minimum of <b>6</b> characters and maximum of <b>250</b></font><br />';
  61.         }
  62.  
  63.         //Cheking Passwords match
  64.         if ($user_pass != $user_repass) {
  65.             $error = TRUE;
  66.                 echo '<font color=\'#FF0000\'>Passwords doesn\'t match</font><br />';
  67.         }
  68.  
  69.         //If we no have error query will send to datebase
  70.         if (!$error) {
  71.             if(mysqli_query($connect, "INSERT INTO `".USERS_TABLE."` (user_name, user_pass, user_mail, user_avatar) VALUES('$user_name', '$hashed_pass', '$user_mail','$user_avatar ')")) {
  72.                 echo "<font color=\'green\'>Successfully Registered! </font><br /><a href='signin.php'>Click here to Sign in</a>";
  73.             } else {
  74.                 echo "<font color=\'red\'>invalid registration!</font>";
  75.             }
  76.         }  
  77.     }
  78. }
« Последна редакция: 14 Юни 2016, 21:13:43 от Avalanche »

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 269
  • Публикации: 2595
  • meow
Код: PHP
  1. "SELECT * FROM `".USERS_TABLE."` WHERE user_name = '$user_name' AND user_pass = '".md5($user_pass)."'"

Сега от къде се появи тоя md5? :)
По-скоро ще намериш някакъв потребител в тази таблица, ако в заявката търсиш за криптирания $user_pass с password_hash.
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
В какъв смисъл нещата не ти се получават? Дай малко повече инфо. Писал съм по темата във форума Потърси с търсачката.

Darnel

  • Full Member
  • ***
  • Благодарности
  • -Казани: 32
  • -Получени: 3
  • Публикации: 139
Това мд5 го няма , просто съм пропуснал да го махна. Дори и без него пак не мога да разбера как да направя проверката и като цяло кода....И не мога да разбера как така ще декларирам хеш проверка в регистер файла и после ще проверя дали съвпада хеша от базата данни в логина с password_verify при положение че метода ми иска 2 параметъра парола и хеш а хеша ми е в регистера не в логина...

В рег файла хеширането ми е така
<?php $hash password_hash($passPASSWORD_BCRYPT);
И как въобще става проверката в логина като ми иска 2 параметъра тази верификация на паролата? В логина не може да има само
password_verify($pass, $hash) и да работи при положение че 2рия параметър $hash го нямам?
« Последна редакция: 14 Юни 2016, 23:39:38 от Darnel »

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 120
  • -Получени: 73
  • Публикации: 995
  • Кибик
Ето пример:
Код: PHP
  1. if (\password_verify($pass, $res['pass']) === true) {
  2. // логване
  3. } else {
  4. // нелогване
  5. }
като $pass е от логинформата, $res['pass'] е хеша е от базата-данни.
« Последна редакция: 15 Юни 2016, 18:43:44 от HanKrum »
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

HanKrum

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 120
  • -Получени: 73
  • Публикации: 995
  • Кибик
Явно не си разбрал и кондиката с криптирането, ето пример:
Код: PHP
  1. $cnf = array('salt' => \sha1('234623462346'), 'cost' => 12);
  2. $hash = \password_hash($pass, PASSWORD_BCRYPT, $cnf);
...като $pass е от формата за регистрация, а  $cnf е посоляването и $hash си го записваш в базата-данни за да го ползваш в горния пример.
« Последна редакция: 15 Юни 2016, 18:54:49 от HanKrum »
"Силата на правителството се крепи на невежеството на народа, и те знаят това и винаги ще се борят против просвещението." Лев Толстой

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 269
  • Публикации: 2595
  • meow
В базата данни имаш зашисана криптираната парола като стринг (нещо от тоя сорт $2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a), и сега трябва да провериш, дали аджеба има такъв потребител, с абсолютно същия стринг записан като парола. Това въпросно нещо, вместо с md5, не може ли да стане по този начин?

Код: PHP
  1. $sql = "SELECT *
  2.        FROM `" . USERS_TABLE . "`
  3.        WHERE user_name = '$user_name'
  4.            AND user_pass = '" . password_hash($user_pass, PASSWORD_DEFAULT) . "'";
  5.  
  6. $result = mysqli_query($connect, $sql);
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!