Как вы храните пароли и проверяете их корректность
Обычно я не заморачивался, да и задачи такие возникали не часто. Но сейчас задача ответственная.
На сколько я понимаю способов хранения паролей в БД не много: 1) В открытом виде (не обсуждаем его) 2) MD5 3) Обратимое шифрования (blowfish например) 2 MD5 На мой взгляд, тут минус в том, что пароль будет передаваться по сети, и если нет HTTPS, то это не самое надёжное решение. Это немного защищает от слива БД, но не от перехвата трафика. 3) blowfish Тут можно сделать алгоритм хитрее. 1) Клиент получает случайную строку, которую ему требуется зашифровать с помощью ключа-пароля. 2) Сервер ищет строку в БД с соотв логином, пытается расшифровать полученнную от клиента строку с помощью пароля юзера взятого из БД и сравнивает результат с исходной случайной строкой, которая привязана к сессии. 3) Сами пароли в БД могут так же храниться зашифрованные алгоритмом blowfish Плюсы: пароль не передаётся по сети. Перехват того что передаётся ни чего не даст, тк шифруемая случайная фраза каждый раз будет разная. Минус: где то, на сервере должен лежать ключ, которым можно расшифровать пароль пользователя. Тут возникает вопрос как его защитить. Есть идея сделать отдельный сервис на С++ занимающийся проверкой паролей. Пока это всё что я смог придумать. Что думаете товарищи? |
Tim, твои знания безнадёжно устарели. md5 100 лет как нигде не используется, этот алгоритм скомпроментирован и элементарно ломается через радужные таблицы. Т.е. если используешь md5, то можешь хранить в чистов виде - разницы нет.
Для хранения хешей паролей есть стандартизированная функция PBKDF2 (в ноде из коробки есть), где используется алгоритм SHA-2. Надёжность определяется длиной ключа, количеством итераций хеширования и длиной соли. Я обычно использую длину 256, соль 32 (уникальная для каждого пароля, хранится в БД) + статическая соль 32 (хранится в коде) и 8000 итераций, но если надёжность оч важна, то ставь 512 и хотя бы 10 000. Операция хеширования крайне тяжёлая, поэтому есть смысл положить на отдельный сервак. Что касается снифинга трафика - ставь https и не еби мозг. А вот пытаться придумать свой алгоритм защиты точно не стоит :) Криптография -не место для велосипедов. Цитата:
|
Цитата:
Вот нагуглиг кое-что по теме: Какое шифрование АНБ не по зубам АНБ скомпрометировало протокол Диффи-Хеллмана? А вот из википедии выдержка: Цитата:
kobezzza, а как на счёт защиты ключа который лежит на серваке? |
kobezzza,
я имею ввиду, как защитить ключ если сервер подломят. |
Tim, используй SHA-2
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Единственно, что могу еще добавить - хранить коды доступа к сервисам и соли в коде плохая практика. Лучше цепляй их из переменных окружения, а туда добавляй ручками сам :) Резюме: 1) Используй HTTPS; 2) Используй PBKDF2, а не чистую хеш функцию; 3) Храни статичные коды доступа в переменных окружения сервера. Также если хочется использовать шифрование на клиенте, то смотри новое API браузера Crypto или компиль в asm.js/wasm и тащи на клиент C-ные либы, но сам ничего не пиши :) |
Цитата:
|
Tim, судя по твоему первому посту, я предлагаю тебе освежить в глове матчасть по методам шифрования, вспомнить, кто такой Боб, кто Алиса. После чего определиться, какое именно шифрование требуется в твоем конкретном случае (симметричное/ассиметричное).
Если симметричное, см. пост кобеззы. Если ассиметричное, вероятно, пригодится библиотека от гугла -- crypto-js. |
свой коммент выше убрал сюда http://javascript.ru/forum/offtopic/...tml#post438555
|
Часовой пояс GMT +3, время: 02:18. |