Intereting Posts
Веб-приложение должно взаимодействовать с последовательным портом Получить расширение файла (basename?) Возвращение отсутствующих результатов от многих до многих таблиц MySQLi num_rows возвращает 0 PHP-кеширование результатов sql Значение по умолчанию переменных в PHP? Генерация отчетов в PHP (требуется формат pdf, xls, doc, csv) WooCommerce: функция, возвращающая все идентификаторы продукта в определенной категории Преобразование байтового потока в числовой тип данных realurl генерирует записи без cHash Радио-кнопка всегда принимает логическое значение 0 в laravel Почему этот вызов PHP для json_encode бесшумно терпит неудачу – неспособность обрабатывать одиночные кавычки? Невозможно загрузить динамическую библиотеку 'c: /wamp/bin/php/php5.5.12/ext/php_ldap.dll' – указанный модуль не найден. в Unknown в строке 0 Слияние двух изображений с прозрачными пленками в PHP Как остановить галерею javascript php на последнем или первом изображении?

Crypt () генерация соли и шифрование паролей, хорошо выполненные?

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

Это функция «шифрования»:

function crypt_pass( $input ){ $salt = substr(sha1(date('r')), rand(0, 17), 22); $cost = 10; $hash = '$2y$' . $cost . '$' . $salt; $pw_and_salt['pw'] = crypt($input, "$hash"); $pw_and_salt['salt'] = $salt; return $pw_and_salt; } 

Я храню как пароль, так и соль в моей БД. Вот функция входа:

 function login(){ $this->db->select('salt'); $salt = $this->db->get_where('users', array('username' => $this->input->post('username') ) )->row(); $where = array( 'username' => $this->input->post('username'), 'password' => crypt( $this->input->post('password'), '$2y$10$' . $salt->salt), ); $user = $this->db->get_where('users', $where)->first_row(); if (!$user) { return FALSE; }else{ if(!empty($user->activation)){ return 2; }else if($user && empty($user->activation)){ $this->session->set_userdata('id',$user->id); $this->session->set_userdata('username',$user->username); $this->session->set_userdata('first_name',$user->first_name); return 1; } } } 

Я реализую это правильно? Это достаточная безопасность?

ВЕРСИЯ 2: НЕ ХРАНЯЙТЕ СОЛЬ, ВЫЗВАННЫЙ ИЗ ПАРОЛЯ В БД ВМЕСТО:

 function login(){ $this->db->select('password'); $pw = $this->db->get_where('users', array('username' => $this->input->post('username') ) )->row(); $where = array( 'username' => $this->input->post('username'), 'password' => crypt( $this->input->post('password'), $pw->password), ); $user = $this->db->get_where('users', $where)->first_row(); if (!$user) { return FALSE; }else{ if(!empty($user->activation)){ return 2; }else if($user && empty($user->activation)){ $this->session->set_userdata('id',$user->id); $this->session->set_userdata('username',$user->username); $this->session->set_userdata('first_name',$user->first_name); return 1; } } } 

Solutions Collecting From Web of "Crypt () генерация соли и шифрование паролей, хорошо выполненные?"

Есть некоторые моменты, которые можно улучшить, но сначала я бы рекомендовал использовать новую функцию PHP password_hash () . Эта функция генерирует безопасную соль и включает ее в полученное значение хеша, поэтому вы можете сохранить ее в одном поле базы данных. Существует также пакет совместимости для более ранних версий.

 // Hash a new password for storing in the database. // The function automatically generates a cryptographically safe salt. $hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); // Check if the hash of the entered login password, matches the stored hash. // The salt and the cost factor will be extracted from $existingHashFromDb. $isPasswordCorrect = password_verify($password, $existingHashFromDb); 

Некоторые мысли о вашем коде:

  1. Вы генерируете хэширование BCrypt с помощью crypt (), поэтому соль будет частью полученного хэша. Нет необходимости хранить его отдельно.
  2. Генерация соли может быть улучшена, используйте случайный источник операционной системы MCRYPT_DEV_URANDOM.
  3. Если вы измените коэффициент стоимости на 9, формат станет недействительным, потому что крипт ожидает две цифры.