2010-10-09 2 views
4

Я прочитал об использовании MySQL AES_ENCRYPT/AES_DECRYPT (двустороннее шифрование) менее безопасен, чем использование PHP - hash() (одностороннее шифрование).Безопасность PHP и MySQL: однонаправленное шифрование Vs двустороннее шифрование

http://bytes.com/topic/php/answers/831748-how-use-aes_encrypt-aes_decrypt

Верно ли, что это более безопасно, что «Вместо того, чтобы направить пользователя свой пароль, просто отправить ему ссылку, которую он может нажать на, чтобы сбросить свой пароль, вместо этого.»?

И, кроме того, если я использую MySQL AES_ENCRYPT/AES_DECRYPT (который я очень увлекаюсь ...), как определить ключ, который может быть принят MySQL? например, важна ли длина ключа? или я могу просто использовать «123123 @ 123123» в качестве ключа?

спасибо!

ответ

7

Существует принципиальная разница между этими двумя понятиями, хеширования и шифрования:
Шифрование может быть отменено, хеширования не может (по крайней мере, это идея).

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

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

Например, длина ключа важна? или я могу просто использовать «123123 @ 123123» в качестве ключа?

AFAIK MySQL AES_ENCRYPT может принимать ключи произвольной длины; но, очевидно, более короткие ключи облегчат атакующему команду для ее принудительной работы (т. е. попробуйте все возможные комбинации).

1

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

Хеширование пароля означает, что вы не можете пропустить пароль злоумышленнику, потому что вы даже не знаете, что это такое. Вы все еще можете проверить, является ли отправленный пароль таким же, как исходный пароль, путем его хэширования с использованием того же алгоритма и соли, поэтому вы все равно можете определить, является ли переданный пароль правильным или неправильным, не зная, что такое пароль.

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

1

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

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

Что касается ключей для AES_ENCRYPT/DECRYPT-- MySQL будет принимать переменные длины для параметра key для функций, но он будет использовать 128-битный ключ независимо от того, что вам выгодно передавать не менее 128 бит ,

+0

спасибо за ответ, что такое 128-бит ...? – laukok

2

Двустороннее шифрование по своей сути менее безопасно, поскольку реальные данные где-то хранятся. То есть у вас есть пароль «привет». Затем вы получите его, вы получите 5d41402abc4b2a76b9719d911017c592. Это не имеет смысла для нормального человека, и они не будут знать, как его расшифровать, не зная правильного алгоритма шифрования. Они не могут использовать это либо потому, что используется только исходный пароль. Вы проверяете пароль, хешируя его и сравнивая его с хешем (также сохраняемым). 5d41402abc4b2a76b9719d911017c592 хешируется 69a329523ce1ec88bf63061863d9cb14, поэтому они не совпадают. Даже если пользователь знает хешированный пароль, он ничего не может извлечь из этого.

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

Безопасность отправки пользователю ссылки по сравнению с предоставлением им пароля - это другая проблема. Если вы отправляете по электронной почте пароль, он распечатывается в виде простого текста, чтобы все могли видеть (и использовать). Предоставление им ссылки, позволяющей им вводить новый пароль, означает, что никто не увидит, что это немного более безопасно, но если кто-то совершает мошенничество, имеет доступ к этой ссылке, в любом случае это вызовет проблемы.

Об AES, я не могу узнать слишком много об этом с первого взгляда, но похоже, что не имеет значения, что вы шифруете. Поэтому, если вы используете AES_DECRYPT (AES_ENCRYPT ('x', 'b'), 'b'); он вернет «x». Вы должны следить за ключом.

0

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

Двухстороннего средство шифрования, существует функция шифрования и дешифрования. В PHP это выполняется через функции mcrypt_encrypt() и mcrypt_decrypt().

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