У меня есть пароль, который передается из приложения iPhone в базу данных через php-скрипт, user.php.
Переменная $ pass заполняется следующим:
$pass = str_replace("'", "", $_REQUEST['pass']);
Как я могу зашифровать это до его вставки в мою базу данных? Я немного читал о разных методах, но искал лучший способ справиться с этим.
Спасибо всем.
Если вам не нужно получать фактическое значение пароля (из зашифрованного значения базы данных), вы можете запустить на нем алгоритм одностороннего хэша (например, sha1: http://php.net/manual/en/function. sha1.php ). Эта функция вернет определенную длину строки (хэш), которая не может быть использована для поиска исходной строки (теоретически). Возможно, что две разные строки могут создать один и тот же хэш (называемый столкновением), но это не должно быть проблемой с паролями.
Пример: $pass = sha1($_REQUEST['pass']);
Одна вещь, чтобы сделать ее более безопасной, – добавить соль в хэш и снова запустить функцию хэша. Это затрудняет создание хэша паролей со злым умыслом, поскольку значение соли обрабатывается только на стороне сервера.
Пример: $pass = sha1(sha1($_REQUEST['pass']).sha1("mySalt@ $# (%"));
Используйте библиотеку криптографии php. Md5 не шифрование, это хеширование.
Кроме того, соль ваши пароли. Зачем?
Во-первых, вы должны создать случайную соль пользователя. Затем вы должны сохранить это и хэш пароля в базе данных.
$salt = md5(unique_id().mt_rand().microtime()); $pass = sha1($salt.$_REQUEST['pass']);
и сохраните $ salt и $ pass в базе данных. Затем, когда они заходят в систему, вы просматриваете их строку и проверяете хэш:
$user = query('SELECT * FROM `user` WHERE username = ?', array($_REQUEST['username'])); if($user) { // If the password they give maches if($user->pass === sha1($user->salt. $_REQUEST['pass'])) { // login } else { // bad password } } else { // user not found }
Создание пользовательской соли для каждой учетной записи заставляет таблицы радуги бесполезны, и любой, кто сломался на вашем сервере, должен был бы переборщить каждый пароль.
Используйте склеп с солью. Такие как
$user = strip_tags(substr($_REQUEST['user'],0,32)); $plain_pw = strip_tags(substr($_REQUEST['pass'],0,32)); $password = crypt(md5($plain_pw),md5($user));
как на http://www.ibm.com/developerworks/opensource/library/os-php-encrypt/
Самое основное: Хешируйте его MD5 или SHA1
$newpass = md5($_REQUEST['pass']);
или
$newpass = sha1($_REQUEST['pass']);
Недавно я также начал хранить хэшированное имя пользователя, поэтому попытки входа в систему безопасны, используя только хэшированные данные для сравнения.
Вы можете «солить» хэши с дополнительными данными, поэтому, если они скомпрометированы, его ценность не может быть найдена (попробуйте использовать некоторые простые хешированные слова) .. т. md5("mySiteSalt!!" . $_REQUEST['pass']);
строку сайта, чтобы изменить стандартный хеш, например md5("mySiteSalt!!" . $_REQUEST['pass']);
или что-то более продвинутое.
Вы должны использовать SHA1 для хэширования ваших паролей для хранения в базе данных. Это самый простой, но наиболее эффективный способ хранения паролей:
$password = sha1($password);
Это также исключительно безопасно. Хотя его целостность начинает ползать, довольно легко обновить эту функцию до SHA-256 (что невероятно безопасно).
Чтобы узнать, почему md5, sha1 и их скоростные друзья могут не быть хорошей идеей, вы должны прочитать сообщение « Достаточно с таблицами Rainbow»: что вам нужно знать о схемах безопасного пароля Томаса Птачека. Суть:
Наконец, мы узнали, что если мы хотим безопасно хранить пароли, у нас есть три разумных варианта: схема MD5 PHK, схема Bcrypt Provos-Maziere и SRP. Мы узнали, что правильным выбором является Bcrypt.
Примечание: это PHK, а не php.