Так что в основном я зашифровал пароль в своей регистрационной форме:
$query = "INSERT INTO users(first_name, last_name, email, password, username) VALUES ('$fn', '$ln', '$em', SHA('$pw1'), '$un')";
Теперь пароль hashed, но когда я пытаюсь использовать его в моем скрипте входа, он не хочет работать, и функция mysql_num_rows возвращает 0.
<?php ob_start(); //If login button is pressed if(isset($_POST['submitted'])){ //Username clean up if(preg_match('%^[a-zA-Z0-9_-]{6,20}$%', stripslashes(trim($_POST['username'])))){ $u = escape_data($_POST['username']); } else { $u = FALSE; echo '<p><font color="red" size="+1">Please enter valid username</font></p>'; } //Password clean up if(preg_match('%^[a-zA-Z0-9_-]{6,20}$%', stripslashes(trim($_POST['password'])))){ $p = escape_data($_POST['password']); } else { $p = FALSE; echo '<p><font color="red" size="+1">Please enter valid password</font></p>'; } //Check if both matched if($u && $p){ $query = "SELECT * FROM users WHERE username='$u' AND password=SHA('$p')"; $result = mysql_query($query); $count = mysql_num_rows($result); $row = mysql_fetch_array($result, MYSQL_NUM); if($count != 0){ $_SESSION['username'] = $row[1]; $_SESSION['password'] = $row[3]; header("Location: login_confirmed.php"); } else { echo "Wrong username or password!"; } } } ob_end_flush(); ?>
Вероятно, это из-за вашего типа поля пароля. Ваше поле пароля VARCHAR
? Как долго это? Мне кажется, что SHA
генерирует строку дольше, чем это разрешено полем, поэтому она обрезается, когда она хранится, и она соответствует тому, когда вы регенерируете ее для проверки.
Документация MySQL говорит, что вам нужно 40 символов для хранения вывода SHA
.
Вычисляет 160-битную контрольную сумму SHA-1 для строки, как описано в RFC 3174 (Secure Hash Algorithm). Значение возвращается как строка из 40 шестнадцатеричных цифр или NULL, если аргумент равен NULL. Одним из возможных вариантов использования этой функции является хэш-ключ.