2015-04-01 2 views
0

Я делаю небольшую систему входа, используя php внутри рамки Codeigniter. Я использую класс шифрования для кодирования пароля, хранения в базе данных. Затем, при входе в систему, находит свой зашифрованный пароль, используя свое имя пользователя, а затем сопоставляет его с введенным им паролем. Пароли ARE получают кодировку во время регистрации. И в приведенном ниже коде я смог распечатать закодированный пароль из базы данных, но затем он выходит из строя, когда я запускаю его через декодирование. Но никакого сообщения об ошибке, просто ничего.Декодер Codeigniter не работает

public function check_pw(){ 
    //post username and password to database 
    $data['username'] = $this->input->post('username'); 
    $data['password'] = $this->input->post('password'); 
    $this->load->model('lindsdata'); 
    //encoded password returned from database - this is working 
    $return_data = $this->lindsdata->password($data); 
    //$return_data = $this->encrypt->decode($return_data); 
    //print_r shows $return_data does hold the encrypted password 
    //but when I uncomment the line with decode in it, $return_data print_rs nothing. 
    print_r($return_data); 
    if ($return_data == $data['password']) { 
     redirect('/update/user', 'location'); 
    } 
    if($return_data !== $data['password']){ 
     //at this point, $return_data of course still has nothing 
     print_r($return_data); 
     //print_r below is the entered password by user..that shows up. 
     print_r($data['password']); 
     $error['the_error'] = 'Your Credentials are wrong'; 
    }else{ 
     $error['the_error'] = ''; 
    } 
} 

Я пробовал это ниже, чтобы убедиться, что все правильно закодировано ... это вернуло «тест», как ожидалось.

$a = "test"; 
$test = $this->encrypt->encode($a); 
$test = $this->encrypt->decode($test); 
print_r($test); 

Чтобы еще больше запутать меня ... Я первоначально вручную закодированный пароль (как в приведенном выше коде) и поместил результат в базе данных с пользователем (я не создали регистрационную форму еще, просто сделал так, чтобы у меня был пользователь для работы) ... что по какой-то причине он отлично работает. Ни один из других закодированных паролей пользователей не работает. Я не понимаю, почему они не работают во время декодирования. База данных установлена ​​в varchar (255). И я ОПРЕДЕЛЕННО получаю закодированный пароль, когда запускаю его через декодирование ... но потом ничего. Нет сообщения об ошибке или что-то еще, и очень сильно. Спасибо за это. ... и я не опубликовал модель, потому что я не думаю, что это было актуально, так как это действительно возвращает закодированный пароль для проверки, как следует.

EDIT - это не имеет смысла. $ Return_data печатает хэш из БД, а пароль $ возвращает правильный пароль, но $ pw ничего не возвращает. ... может быть, моя база данных SQL каким-то образом разлагает/редактирует хэш? Это должно работать из того, что я могу сказать.

$data['username'] = $this->input->post('username'); 
    $password = $this->input->post('password'); 
    $this->load->model('lindsdata'); 
    $return_data = $this->lindsdata->password($data); 
    print_r($return_data); 
    print_r($password); 
    $pw = password_verify($password, $return_data); 
    print_r($pw); 

EDIT - Мой вход в базу данных довольно прост ... Я не вижу причин для возникновения проблемы. ... все еще не работает либо с расшифровкой, либо с паролем. По-прежнему не проблема. Это простая база данных Mysql ...

public function register_submit(){ 
    $data['user_name'] = $this->input->post('user_name'); 
    $pwd = $this->input->post('password'); 
    $data['password'] = password_hash($pwd, PASSWORD_DEFAULT); 
    $this->load->model('lindsdata'); 
    $this->lindsdata->register($data);  
} 

function register($data){ 
    $this->db->insert('cred', $data); 
} 
+0

Невозможно создать проблему. Ваш тестовый код работает нормально –

+0

Какое значение вставлено в вашу базу данных, когда пароль '' test''; –

+0

тест, который я только что сделал в браузере, не запускал его через базу данных. Я должен попробовать это. –

ответ

0

Это связано с тем, что методы безопасности непосредственно хранят пароль в базе данных, даже если они зашифрованы. Если кто-то получит доступ к вашему серверу, он может взять как код, так и моментальный снимок базы данных и узнать пароли всех пользователей, зарегистрированных на вашем сайте. Лучшей практикой в ​​отношении паролей является сохранение хэша пароля (желательно SHA256 или более сильного) и сравнение хэша пароля, который пользователь вводит в форме входа, с той, которая хранится в базе данных. Или, что еще лучше, вы можете использовать встроенную поддержку PHP-хеширования PHP (http://php.net/manual/en/ref.password.php).

И косвенно, хеширование пароля решит вашу проблему :)

+0

Ах .. после небольшого чтения (я совершенно свежусь к материалам безопасности, я использую стороннюю библиотеку Codeigniter Tank Auth для своих нужд, но на этот раз решил создать свой собственный логин). Поэтому мне кажется, что разница между шифрованием и хэшированием заключается в том, что хэширование не имеет ключа. И хеширование использует фактически слово пароля (надеюсь, что имело смысл) для дешифрования (в двух словах). Правильно ли я понял? Собираюсь попробовать это хеширование. Благодаря! –

+0

Немного смущен этот параметр PASSWORD_DEFAULT. - PASSWORD_DEFAULT - Использовать алгоритм bcrypt (по умолчанию с PHP 5.5.0). Обратите внимание, что эта константа предназначена для изменения с течением времени, когда новые и более сильные алгоритмы добавляются в PHP. По этой причине длина результата от использования этого идентификатора может меняться со временем.Поэтому рекомендуется сохранять результат в столбце базы данных, который может расширяться до 60 символов (255 символов будут хорошим выбором). - Я не получаю то, что храню в базе данных для этого ... –

+0

Что касается хэширования, да, вы можете сказать, что пароль не требуется, однако соль значительно снизит вероятность того, что кто-то расшифрует хешированную последовательность. Обратите внимание, что хэш является односторонней поездкой, вы можете вычислить хэш из строки, однако вы не можете вычислить строку из хэша. Если вы хотите больше узнать о хеширующем пароле, я бы передумал эту статью: https://crackstation.net/hashing-security.htm – Cristik

Смежные вопросы