Во-первых, это НЕ повышает безопасность вашего приложения (если это веб-приложение).
Используйте SSL (или на самом деле TLS, который обычно называется SSL), это не очень дорого (Измерьте время, которое вы используете, чтобы найти способы обойти это, и умножьте его на минимальную заработную плату, покупка сертификата почти всегда выигрывает).
Почему это просто. TLS решает проблему (при использовании с купленными сертификатами, а не самоподписанными), которая довольно серьезна в криптографии: как мне узнать, что сервер, с которым я разговариваю, является тем сервером, с которым, как мне кажется, я разговариваю? Сертификаты TLS - это способ сказать: «Я, центр сертификации, которому доверяет ваш браузер, удостоверяю, что веб-сайт по адресу [url] имеет этот открытый ключ с соответствующим закрытым ключом, который (закрытый ключ) знает только сервер, посмотрите Я подписал весь документ своей подписью, если кто менял, вы можете увидеть ".
Без TLS любое шифрование становится бессмысленным, потому что, если я сижу рядом с вами в кофейне, я могу заставить ваш ноутбук / смартфон думать, что я сервер, а MiTM (Man in The Middle) - вы. С TLS ваш ноутбук / смартфон будет кричать «НЕДОСТАТОЧНОЕ СОЕДИНЕНИЕ», потому что у меня нет сертификата, подписанного центром сертификации, который соответствует вашему сайту. (Шифрование против аутентификации).
Отказ от ответственности: пользователи, как правило, нажимают сразу на эти предупреждения: «Недоверенное соединение? Что? Мне просто нужны мои фотографии котят! Добавить исключение Нажмите Подтвердить Нажмите УРА! Котята! "
Однако, если вы действительно не хотите покупать сертификат, все равно ОБЯЗАТЕЛЬНО реализуйте хеширование javascript на стороне клиента (и используйте для этого стандартную библиотеку (SJCL), НИКОГДА НЕ РЕАЛИЗАЙТЕ КРИПТО САМОСТОЯТЕЛЬНО ).
Почему? Повторное использование пароля! Я могу легко украсть ваш файл cookie сеанса (который позволяет мне представить вашему серверу, что я - это вы) без HTTPS (см. Firesheep). Однако, если вы добавляете javascript на свою страницу входа, который перед отправкой хеширует ваш пароль (используйте SHA256 или, что еще лучше, используйте SHA256, отправьте им открытый ключ, который вы сгенерировали, а затем зашифруете хешированный пароль с этим, вы не сможете использовать соль с этим), а затем отправляет хешированный / зашифрованный пароль на сервер. ПОВТОРИТЕ хэш на вашем сервере с солью и сравните его с тем, что хранится в вашей базе данных (сохраните пароль следующим образом:
(SHA256(SHA256(password)+salt))
(также сохраните соль как открытый текст в базе данных)). И отправьте свой пароль вот так:
RSA_With_Public_Key(SHA256(password))
и проверьте свой пароль вот так:
if SHA256(RSA_With_Private_Key(SHA256(sent_password))+salt_for_username) == stored_pass: login = ok
Поскольку, ЕСЛИ кто-то обнюхивает вашего клиента, они смогут войти в систему как ваш клиент (захват сеанса), но они НИКОГДА не увидят пароль в виде открытого текста (если только они не изменят ваш javascript однако хакер Starbucks, вероятно, не будет знать, как / быть заинтересованным в этом.) Таким образом, они получат доступ к вашему веб-приложению, но не к своей электронной почте / facebook / и т. д. (для которого ваши пользователи, скорее всего, будут использовать один и тот же пароль). (Адрес электронной почты будет либо их логином, либо будет найден в их профиле / настройках в вашем веб-приложении).
person
FriendlyCryptoNeighbor
schedule
09.05.2014