Каков наилучший способ реализации двухстороннего шифрования с помощью PHP? - PullRequest
7 голосов
/ 15 марта 2009

Я хотел бы зашифровать пароли на своем сайте, используя двустороннее шифрование в PHP. Я сталкивался с библиотекой mcrypt, но она кажется такой громоздкой. Кто-нибудь знает какие-либо другие методы, которые проще, но безопаснее? У меня есть доступ к Zend Framework, поэтому решение, использующее его, также подойдет.

Мне действительно нужно двустороннее шифрование, потому что мой клиент хочет зайти в базу данных и изменить пароль или восстановить его.

Ответы [ 4 ]

25 голосов
/ 15 марта 2009

Вы должны хранить хэши паролей (и правильно соленые ).

Нет в мире оправдания, который достаточно хорош, чтобы нарушить это правило. В настоящее время использование crypt , с CRYPT_BLOWFISH, является лучшей практикой.
CRYPT_BLOWFISH в PHP является реализацией хеша Bcrypt. Bcrypt основан на блочном шифре Blowfish.

  • Если ваш клиент пытается войти, вы хэшируете введенный пароль и сравниваете его с хешем, хранящимся в БД. если они совпадают, доступ предоставляется.

  • Если ваш клиент хочет изменить пароль, ему нужно будет сделать это с помощью небольшого скрипта, который правильно хеширует новый пароль и сохраняет его в БД.

  • Если ваш клиент хочет восстановить пароль, следует сгенерировать новый случайный пароль и отправить его вашему клиенту. Хеш нового пароля хранится в БД

  • Если ваши клиенты хотят посмотреть текущий пароль, им не повезло . И именно в этом и заключается смысл хеширования пароля: система не знает пароль, поэтому его никогда нельзя «найти» / украсть.

Джефф написал об этом в блоге: Возможно, вы неправильно храните пароли

Если вы хотите использовать стандартную библиотеку, вы можете взглянуть на: Переносимая среда хеширования паролей PHP и убедиться, что вы используете алгоритм CRYPT_BLOWFISH.

(Вообще говоря, возиться с записями в вашей базе данных напрямую вызывает проблемы.
Многие люди, в том числе очень опытные администраторы БД, нашли это на своем пути.)

7 голосов
/ 15 марта 2009

Не шифруйте пароли. Вам никогда не нужно расшифровывать их, вам нужно только проверить их. Использование mcrypt не намного лучше, чем вообще ничего не делать, поскольку, если хакер проник на ваш сайт и украл зашифрованные пароли, он, вероятно, также сможет украсть ключ, используемый для их шифрования.

Создайте единственную функцию «пароль» для вашего php-приложения, где вы берете пароль пользователя, объединяете его с солью и запускаете полученную строку через функцию хеширования sha-256 и возвращаете результат. Всякий раз, когда вам нужно подтвердить пароль, вам нужно только убедиться, что хеш пароля совпадает с хешем в базе данных.

http://phpsec.org/articles/2005/password-hashing.html

4 голосов
/ 15 марта 2009

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

2 функции для достижения этой цели: openssl_public_encrypt() и openssl_private_decrypt()

1 голос
/ 16 марта 2009

Либо сохраните его в открытом виде, либо сохраните хэш (т.е. НЕ обратимый) пароля.

Делать что-либо еще - в частности, использовать симметричное шифрование с жестко закодированным ключом - в принципе бессмысленно.

Если вы делаете так, как вы предлагаете, и ваша машина была скомпрометирована, злоумышленник получает доступ не только к зашифрованным паролям, но также к коду и ключу для их расшифровки, поэтому они также могут храниться в открытом виде. 1005 *

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...