Каков безопасный способ хранения пароля с помощью Code Igniter?

Я использую Code Igniter для моего текущего проекта.

На данный момент я использую MD5 для хэширования паролей, но я читал во многих местах, что это не очень хорошая практика.

С чем мне пойти?

  • Использование соли
  • Или использовать bcrypt

Кроме того, если рекомендуется bcrypt, как использовать его с Code Igniter?

ИЗМЕНИТЬ

Я поставил эти файлы в application/libraries

  • PasswordHash.php
  • с /Makefile
  • с /crypt _private.c

В моем контроллере я использую этот код -

$params = array(
       'phpass_hash_strength' => 8,
           'phpass_hash_portable' => FALSE
       );
$this->load->library('PasswordHash', $params);
$password = $this->passwordhash->HashPassword($pwd);

Я получаю эти ошибки -

A PHP Error was encountered

Severity: Notice

Message: Uninitialized string offset: 3

Filename: libraries/PasswordHash.php

Line Number: 116

A PHP Error was encountered

Severity: Warning

Message: strpos() [function.strpos]: Empty delimiter

Filename: libraries/PasswordHash.php

Line Number: 116

Update

Удалено PasswordHash.php, используя SimpleLoginSecure.

Ответ 1

Использовать bcrypt. Это обсуждение появилось здесь в комментариях к моему ответу. Вы можете использовать библиотеку, такую ​​как phppass, чтобы действительно упростить шифрование паролей.

Что касается соли. Используй это! В противном случае кто-то может просто перейти на этот сайт и загрузить таблицы радуги, которые будут охватывать большое количество паролей, которые выбирают средние пользователи. Особенно со всеми утечками безопасности за последние несколько месяцев, сейчас не время говорить, что вы не будете использовать что-то простое, чтобы реализовать как случайную соль.

UPDATE

Чтобы использовать PHPPass с CI, загрузите и извлеките файлы с сайта phppass, связанного выше. Поместите файл PasswordHash.php в каталог приложений/библиотек CI.

В вашем коде вы затем загружаете библиотеку через: $this->load->library('PasswordHash',array(8, FALSE));

Хеширование паролей так же просто, как $this->PasswordHash->HashPassword($password);

Чтобы позже проверить, правильно ли пароль, это так же просто, как:

$password = $_POST['password'];
$actualPassword = /*Get the hashed password from your db*/;

$check = $this->PasswordHash->CheckPassword($password, $actualPassword);

Я взял эту демонстрацию из http://dev.myunv.com/articles/secure-passwords-with-phpass/, которая дает вам больше информации. Я немного модифицировал этот учебник, чтобы использовать загрузчик CI, поэтому вам не нужны инструкции include или new.

Ответ 2

зачем использовать md5(), когда он так же прост в использовании sha1()?

Также использование паспортов всегда является хорошей идеей, так как эффективно удаляет угрозу Rainbow Table атака

По моему опыту соленый хэш SHA1 безопасно защищен для 99% ситуаций веб-приложений.

Ответ 3

Код Igniter изменился с момента запроса этого вопроса. Но для тех, кто, возможно, не сталкивался с обширной документацией CI или не видел этого раньше, CI имеет класс шифрования, который обеспечивает двухстороннее шифрование данных с использованием библиотеки Mcrypt PHP.

После инициализации класса с помощью:

$this->load->library('encrypt');

Вы можете зашифровать следующим образом:

$msg = 'My secret message';
$encrypted_string = $this->encrypt->encode($msg);

и расшифруйте следующим образом:

$encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';
$plaintext_string = $this->encrypt->decode($encrypted_string);

CI также имеет не декодируемое однопоточное хеширование:

$hash = $this->encrypt->sha1('Some string');

Для получения дополнительной информации см. http://www.codeigniter.com/user_guide/libraries/encryption.html