это некоторые функции, которые я использую для шифрования паролей и проверки пароля. Было интересно, если это хороший способ справиться с этим. Я использую 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; } } }
Есть некоторые моменты, которые можно улучшить, но сначала я бы рекомендовал использовать новую функцию 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);
Некоторые мысли о вашем коде: