2012-05-31 3 views
4

Я работаю над созданием базовой безопасности паролей на веб-сайте PHP CodeIgniter среднего размера. Мне нужно начать шифрование пароля, который сохраняется в базе данных. Пользовательские пароли могут быть вставлены с использованием разных методов, включая импорт CSV или индивидуальный подход к регистрации.В архитектуре MVC, где должно выполняться шифрование пароля

Поэтому я просто хочу знать, что такое правильный уровень в системе MVC, где пароль должен быть зашифрован?

ответ

2

Единственный раз, когда вам нужно выполнить эту функцию, - это добавить нового пользователя или обновить пароль для существующего пользователя. Обе эти функции должны выполняться моделью пользователя. Например, что-то вроде:

$user = new User(); 
$user->setName('...'); 
$user->setPassword('...'); 
$user->save(); 

или:

$user = User::find('...'); 
$user->setPassword('...'); 
$user->save(); 

В этом примере, метод SetPassword() будет делать фактическое шифрование.

Кроме того, подумайте об этом таким образом - не должно быть возможности получить незашифрованный пароль в системе. Таким образом, вы создаете модель User только для взаимодействия с пользователями и должны прозрачно шифровать все предоставленные ей пароли.

+0

Последующий вопрос: загрузка информации из базы данных в этот класс пользователя, вы бы создали новый метод для загрузки уже зашифрованного поля пароля? – GrayB

+0

Нет, это не отличается от загрузки любого другого поля, например, имени пользователя или адреса электронной почты. В базе данных хранится зашифрованная форма пароля, и это то, что вы получите, когда вы вызываете $ user-> getPassword(). Незашифрованная форма не хранится нигде, никогда. –

+0

Мой комментарий не был очищен, мой вопрос касался использования метода setPassword. Если я получаю информацию из базы данных, я получу зашифрованный пароль, поэтому использование setPassword ($ row-> password) зашифрует уже зашифрованный пароль.Поэтому я предполагаю, что должен просто добавить дополнительный метод setPasswordFromDB, где я его не зашифровываю. Это звучит как правильное решение? – GrayB

0

Все зависит от того, как вы храните свои пароли.

я обычно делаю:

  1. Создать пользователя с полем ввода пароля, установленного в ничто (не нулевой).
  2. Вставьте пользователя в базу данных, создав таким образом новый UserID.
  3. Используйте вновь вставленный UserID, а также дополнительную соль для создания пароля и сохранения.

Если вы не использовали идентификатор пользователя или сгенерированную среду выполнения (т. Е. На вставке), вы можете одновременно вставлять и шифровать пароль.

Edit ...

К сожалению, я унаследовал ваше использование Encrypt, однако для пароля, вы «должны» только когда-либо HASH пароль.

Простой пример:

md5(md5(UserID).md5('Password')) 

Затем, когда пользователь вводит в их электронной почте/имя пользователя и пароль, вам просто нужно так:

select * from User where Username = 'myusername' and Password = md5(concat(md5(UserID), md5('Password'))) 

вместо расшифровки пароля.

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