php шифрование sql - PullRequest
       16

php шифрование sql

2 голосов
/ 25 октября 2009

Мне нужна форма, где пользователь может сменить пароль. Я могу зашифровать пароль, однако, когда он выбран из базы данных (оригинальный пароль говорит «тест»), он не распознает его.

Это когда пароль был зашифрован в дБ. я проверяю, совпадает ли введенный в форме пароль с паролем в БД:

SELECT * from table where password = md5('$typed_password')

Вот как это зашифровано:

UPDATE table set field = md5('$typed_password' )

Как мой выбор может работать так, чтобы, когда пользователь набирает его в форме, распознавался исходный?

Ответы [ 3 ]

4 голосов
/ 25 октября 2009

во-первых: MD5 - это криптографическая хеш-функция , не обязательно метод шифрования. Хэш предназначен для выполнения только в одном направлении и не может быть обращен. (это хорошо)

MD5, однако, криптографически взломан (больше не считается безопасным); вам следует использовать другую хеш-функцию (предпочтительно Bcrypt-hash или хотя бы SHA256)

Глядя на код, я вижу несколько неправильных вещей:

  1. ваш пароль не соленый
  2. Я действительно надеюсь, что $typed_password должным образом очищен, или вы собираетесь SQL-инъекция .
  3. Вы пытаетесь выбрать всех пользователей из таблицы с одинаковым паролем.

Самый простой (и, вероятно, лучший) способ создания паролей - использовать стандартную библиотеку: Переносимая среда хэширования паролей PHP и убедитесь, что используется алгоритм CRYPT_BLOWFISH.

require('PasswordHash.php');

$pwdHasher = new PasswordHash(8, FALSE);

// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );

// $hash would be the $hash stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

запросы store / check / update должны быть привязаны к идентификатору пользователя:

// Insert query
$query = "INSERT INTO users VALUES({$userId}, '{$username}', '{$hash}')";

// Select query
$query = "SELECT hash FROM users WHERE userId = {$userId}";

// Update query
$query = "UPDATE users SET hash = '{$hash}' WHERE userId = {$userId}";

И затем, вы должны использовать параметризованные запросы вместо прямой передачи значений переменных в запрос.

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

1 голос
/ 25 октября 2009

Почему бы не зашифровать пароль в PHP, а затем INSERT уже зашифровать один.
То же самое с SELECT.

Итак:

$enc_passwd = md($typed_password);
$sql = "SELECT * FROM table WHERE password = '$enc_passwd')";

аналогично UPDATE

(почему не INSERT?)

0 голосов
/ 25 октября 2009

Последнее сообщение о паролях Я получил немного не по теме и многое рассказал об этом. Тидбит:

Как только вы довольны паролем, они выбрали сначала зашифровать его с помощью PHP, а затем сохранить. Следующая функция шифрования паролей тоже не моя идея, но решает ряд проблем. Шифрование в PHP не позволяет людям на общем сервере перехватывать ваши незашифрованные пароли. Добавление чего-либо для пользователя, которое не изменится (я использую электронную почту, так как это имя пользователя для моих сайтов) и добавление хэша (SALT - это короткая постоянная строка, которую я изменяю для каждого сайта) повышает устойчивость к атакам. Поскольку ОСВ находится внутри пароля, и пароль может быть любой длины, становится почти невозможно атаковать это с помощью радужной таблицы. Кроме того, это также означает, что люди не могут изменить свою электронную почту, и вы не можете изменить ОСВ, не аннулировав пароль каждого.

function password_crypt($email,$toHash) {
   $password = str_split($toHash,(strlen($toHash)/2)+1);
   return hash('sha256', $email.$password[0].SALT.$password[1]); 
}

Итак, при первом вводе пароля пользователя в псевдокоде:

define(SALT,'blah');
$hashed_password = password_crypt($email,$password);
INSERT INTO users (email,hashed_password) VALUES ($email,$hashed_password);

Затем для проверки последующего входа в систему псевдокодом:

define(SALT,'blah');
$user_hashed_password = password_crypt($_POST['username'],$_POST['password']);
SELECT email FROM users WHERE email = ? AND hashed_password = $user_hashed_password LIMIT 1

Если вы получили строку назад, действительный логин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...