Шифрование пароля на стороне клиента

Возможный дубликат:
О системе хеширования паролей на на стороне клиента

Я должен защитить пароли пользователей моего веб-сайта. Я использовал хеширование MD5 encryption на стороне сервера. Но проблема в том, что пароли остаются в виде обычного текста до тех пор, пока не поступят на сервер, а это означает, что пароль может быть захвачен с помощью мониторинга трафика. Итак, я хочу использовать механизм шифрования / хеширования паролей на стороне клиента и отправить зашифрованный / хешированный пароль. Кто-нибудь может сказать, как это сделать?


person dinesh senartne    schedule 08.11.2010    source источник
comment
MD5 - это не шифрование. Что-то зашифрованное можно расшифровать по определению   -  person Gareth    schedule 08.11.2010
comment
Верный Гарет. MD5 - это односторонний алгоритм криптографического хеширования, это не шифрование, потому что, как вы правильно заявили, его нельзя расшифровать с помощью формулы. Это может быть только грубая атака или проверка по таблице известных хешей.   -  person    schedule 08.11.2010
comment
Да, и когда вы храните хэш MD5 (или любой другой тип хеша) пароля, никогда не забывайте использовать соль! (owasp.org/index.php/Hashing_Java#Why_add_salt_.3F )   -  person Pascal Qyy    schedule 08.11.2010
comment
Имейте в виду, что MD5 тоже сломан. См. Здесь win.tue.nl/hashclash/rogue-ca это возможно создать один и тот же MD5 с разными данными   -  person m.edmondson    schedule 08.11.2010
comment
Это не дубликат, другой вопрос о хешировании, а этот - о шифровании. Он очень отличается, хотя некоторые люди, не знакомые с технологиями, предложили хеширование в качестве решения;   -  person Pushpendra    schedule 17.05.2018
comment
@Pushpendra Речь идет о MD5, это хеширование, а не шифрование. В данных обстоятельствах неразумно критиковать «некоторых людей, не разбирающихся в технологиях».   -  person user207421    schedule 12.03.2021


Ответы (9)


Это будет небезопасно, и легко объяснить, почему:

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

Но злоумышленнику не нужно выяснять, какой пароль, потому что ваш сервер больше не ожидает пароль - он ожидает токен. И злоумышленник знает токен, потому что он отправляется по незашифрованному протоколу HTTP!

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

И, наконец, вы действительно хотите, чтобы у пользователей был включен JavaScript, прежде чем они смогут войти на ваш сайт?

В любом случае SSL больше не является дорогостоящим или сложным в настройке решением.

person Gareth    schedule 08.11.2010
comment
+1 за объяснение, почему идея в корне ошибочна. В этом случае лучше всего подойдет SSL / TLS. - person vcsjones; 08.11.2010
comment
Я немного запутался в вашем ответе, потому что, хотя злоумышленник знает токен, как только он собирается его использовать, он должен использовать страницу входа по умолчанию. Если он использует этот токен (зашифрованный пароль), он снова зашифровывается и отправляется на сервер. Значит, он не добьется успеха. - person dinesh senartne; 08.11.2010
comment
Нет, злоумышленнику не обязательно использовать страницу входа. Веб-форма - способ создания веб-запроса для отправки на сервер, но это не единственный способ. Существует множество способов подключиться к серверу и воспроизвести запрос, как если бы он выполнялся веб-браузером. - person Gareth; 08.11.2010
comment
Привет! Вы украли мой ответ! ;) +1 - person ; 08.11.2010
comment
Можно взломать какой-нибудь запрос / ответ без пароля для сохранения в дешифруемом формате на сервере: посмотрите на http-дайджест-аутентификацию (en.wikipedia.org/wiki/ / tools.ietf.org/html/rfc2617#section-3.3). RFC сказал об этом: Обратите внимание, что HTTP-серверу на самом деле не нужно знать пароль пользователя в виде открытого текста. - person Pascal Qyy; 08.11.2010
comment
Opps .. Как упоминал Герет, если есть такие методы, мой механизм хеширования не будет использоваться в полной мере. Но я хочу знать, что очень легко сгенерировать такой HTTP-запрос без использования страницы входа ??? Я думаю, что если это не так просто сделать без использования страницы входа, то нет большого риска реализовать это таким образом. - person dinesh senartne; 08.11.2010
comment
@dinesh Вы можете эмулировать тот же запрос, который отправит веб-браузер, используя curl в командной строке или любое количество других доступных инструментов. Любой, кто знает, как перехватить соединение для получения зашифрованного пароля, не имеет абсолютно никаких проблем с подделкой запроса; даже не глядя на страницу входа в систему. - person deceze♦; 08.11.2010
comment
Ах ... тогда механизм шифрования на стороне клиента не будет хорошим решением .. - person dinesh senartne; 08.11.2010
comment
Шифрование на стороне клиента действительно является решением, ЕСЛИ вы можете убедиться, что источник, доставляющий его, является надежным, а код остается неизменным! Например, приложения chrome или firefox (html css js в контейнере) будут примером этому! - person Herr; 23.11.2014
comment
Этот ответ предполагает, что в первую очередь есть стимул к краже хэшей паролей. Если сервер не хранит никаких конфиденциальных данных, кроме самих паролей (и получение доступа к учетной записи не дает никаких преимуществ), тогда шифрование на стороне клиента в порядке. - person riv; 16.04.2015
comment
Правда, это не защита вашего сервера. Однако это защита вашего клиента (то есть вашего пользователя или клиента), что IMHO так же важно, поскольку у большинства пользователей плохие пароли и, кроме того, они часто используют их повторно. Следовательно, они открываются для всех видов подвигов. ИМО, это делает приведенную выше критику довольно спорной. - person Kebman; 25.08.2015
comment
@Kebman именно это! +1 - person jaaq; 19.01.2017
comment
@Kebman Я согласен. Это единственная причина важности хеширования на стороне клиента. - person Noah Gary; 01.02.2017
comment
Нет, это неправда, серверы, которые не ожидают намеков на то, что хешированный пароль, полученный реальным клиентом, спроектированы высокомерными людьми. Потому что есть гораздо более продвинутые алгоритмы, которые сделают чрезвычайно трудным в большом масштабе всех хакеров обмануть и обмануть серверы, предоставляющие перехваченные хешированные пароли. Могут быть реализованы алгоритмы на стороне клиента и на сервере, где требуется фактический пароль, независимо от того, когда клиент отправляет хешированный пароль. Сервер может определить, кто отправил хешированный пароль, который изначально был введен открытым текстом, что обеспечивает большую безопасность. - person S To; 18.04.2021

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

Вы можете использовать следующие библиотеки:

  • jCryption. Асимметричное шифрование клиент-сервер через Javascript

Обновление через 3 года (2013 г.):

Обновление через 4 года (2014 г.):

person Herr    schedule 08.11.2010
comment
Именно то, что ему нужно, хороший ответ. - person ; 08.11.2010
comment
+1 за то, что это единственный ответ здесь, который фактически предоставил решение того, что хотел OP (т.е. шифрование на стороне клиента) - person ine; 10.11.2010
comment
Спасибо, ребята :) Я попытался донести до сути. - person Herr; 06.02.2012
comment
К сожалению, использование шифрования или хеширования на стороне клиента JavaScript в любом случае сделает такую ​​систему довольно небезопасной. См .: matasano.com/articles/javascript-cryptography - person Bruno; 03.09.2013
comment
@ Бруно, звучит интересно. Я не думал об этом. - person Herr; 03.09.2013
comment
@artjomb спасибо, теперь выглядит лучше. Ах, и вы можете проголосовать за это, alda: D - person Herr; 21.11.2014
comment
ничто не является по-настоящему безопасным, лук / https / md5 / sha-1 / sha-2 jada jada ja ... шифрование так же хорошо, как и хэш алгоритма, из которого он сделан, расшифровка только вопрос того, насколько мощная машина / сервер кто-то у другого есть и между клиент-серверным соединением (или различными другими уловками), и никакой https не предотвращает этого ... Все дело в том, насколько сложно это сделать для тех, кто менее опытен во взломе кода, для тех, кто кто опытен, это не имеет никакого значения, это лишь вопрос времени и раздражения ~ и все это просто грустно, помните, Интернет никогда не должен был быть приватным - person LokizFenrir; 27.05.2015
comment
Остерегайтесь, первая ссылка на jCryption ведет на сайт вредоносной рекламы / спама. Я отметил ответ. - person Akseli Palén; 19.02.2020
comment
Большое спасибо за указание ForgeJS. Я не знал об этом. Оказался отличный выбор. Очень хорошо продуманный и простой для понимания API. - person James Selvakumar; 14.08.2020

Я бы выбрал это простое решение.

Резюмируя это:

  • Клиент «Я хочу войти»
  • Сервер генерирует случайное число #S и отправляет его Клиенту.
  • Client
    • reads username and password typed by the user
    • вычисляет хеш пароля, получая h(pw) (это то, что хранится в БД)
    • генерирует другое случайное число #C
    • объединяет h(pw) + #S + #C и вычисляет его хэш, назовите его h(all)
    • отправляет на сервер username, #C и h(all)
  • Server
    • retrieves h(pw)' for the specified username, from the DB
    • теперь у него есть все элементы для вычисления h(all'), как это делал Клиент
    • если h(all) = h(all'), то h(pw) = h(pw)', почти наверняка

Никто не может повторить запрос на вход как указанный пользователь. #S каждый раз добавляет к хешу компонент переменной (это фундаментально). #C добавляет в него дополнительный шум.

person bluish    schedule 29.04.2011
comment
Человек, я должен сказать, что эта ветка потрясающая. Я в восторге, и ваш ответ недооценен, конечно, хотя он очень просто объясняет фундаментальную концепцию. У меня аналогичная ситуация с исходным автором, и я хотел спросить вас кое-что о вашем решении. - person jigzat; 03.03.2013
comment
(Извините, я случайно нажал клавишу ввода и опубликовал неполный комментарий). Каковы шансы, что злоумышленник перехватит #S с помощью ... Я не знаю, возможно, используя сетевую карту в беспорядочном режиме или клонировав MAC-адрес, а затем используйте этот чтобы расшифровать h (все), я имею в виду, что у него будет #S, а поскольку #C голый, он может хешировать пароль. - person jigzat; 03.03.2013
comment
Спасибо! Я думаю, что шансы очень низкие, если случайные числа достаточно велики. Простое минимальное изменение исходной строки (в нашем случае каждый вход в систему как 2 новых случайных числа) дает совершенно другой хэш. Более того, обратный хэш очень сложен, если исходная строка отсутствует в словаре. Но, может быть, поможет кто-то более опытный, чем я. - person bluish; 04.03.2013
comment
Он по-прежнему уязвим для человека в средней атаке. Без SSL / TLS он никогда не будет безопасным на 100%. Если вы можете перехватить последний запрос, содержащий username, #C и h(all), вы просто отправляете его вместо клиента и входите в систему. - person singe3; 03.08.2015
comment
Можете ли вы многократно использовать хэш с временным окном (т.е.``минутой '' HTTP-запроса), чтобы уменьшить вероятность атаки типа `` злоумышленник в середине '', поскольку сервер отклоняет недопустимый хеш на основе тайм-аутов? - person Stephen; 23.03.2016
comment
@ Стивен, я думаю, это хорошая идея - person bluish; 24.03.2016
comment
Ничто не мешает человеку посередине отправить вам свой номер или даже предоставить вам совершенно другой пользовательский код javascript, который просто передаст пароль в виде обычного текста. Проще говоря, без SSL все попытки просто запутать данные для случайного малыша-скрипта. Я согласен, что, возможно, это все же лучше, чем отправка простого текста, но просто нет способа скрыть информацию от определенного злоумышленника по HTTP-соединению. - person Groo; 13.09.2016
comment
Не работает, если у вас нет репозитория паролей и где вам нужно изменить пароль или токен, как есть для службы аутентификации. Пример 1: вы не можете проверить учетную запись в Active Directory, используя хэш пароля. Пример 2: токены OpenAuth. - person Pushpendra; 17.05.2018
comment
Этот ответ требует соли. Если сервер взломан, все пароли по-прежнему хранятся в виде базового хэша. Если разработан один пароль, то все, кто использует один и тот же пароль, становятся уязвимыми. Применение случайной соли (#s и #c) на этапе аутентификации не поможет, если база данных взломана. - person Kelly Bang; 03.06.2019
comment
Этот ответ хорошо продуман, хакеру придется потратить много времени на реконструирование инновационного алгоритма. Для хакера было бы почти невозможно обмануть или обмануть сервер, если бы сервер продолжал изменять и обновлять алгоритм еженедельно. То, что у нас есть сейчас, - это алгоритм, который больше похож на органический организм, который самонастраивается для защиты и борьбы с хакерами (вирусами). - person S To; 18.04.2021

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

Точные инструкции о том, как этого добиться, будут зависеть от вашего веб-сервера.

В документации Apache есть руководство КАК НАСТРОИТЬ быть полезным. (спасибо пользователю G. Qyy за ссылку)

person Justin    schedule 08.11.2010
comment
Он уже сказал, что не может использовать HTTPS. Вы не можете игнорировать это в своем ответе. - person ; 08.11.2010
comment
@Mike Где он это сказал? Я не вижу этого ни в каких правках или комментариях. - person Justin; 08.11.2010
comment
... проблема в том, что пароли остаются в виде обычного текста до тех пор, пока они не будут доставлены на сервер ... Допустим, это конкретно не говорит о том, что он НЕ МОЖЕТ использовать HTTPS, поэтому я отказался от голосования. - person ; 08.11.2010
comment
Это не означает, что он не может использовать HTTPS, просто он в настоящее время не - person Gareth; 08.11.2010
comment
@Mike Это не плакат, в котором говорится, что он не может использовать https, просто его сейчас нет. - person Justin; 08.11.2010
comment
@Gareth Согласен, поэтому я не проголосовал против. Однако до сих пор не думаю, что это применимый ответ на его вопрос, поскольку я знаю многих людей, у которых нет сертификатов SSL и которые не могут использовать SSL. Поэтому, когда кто-то говорит, что у него нет безопасного соединения, он говорит: «Получите его». не помогает. - person ; 08.11.2010
comment
@Mike SSL в наши дни является неотъемлемой частью основной инфраструктуры Интернета. Если вы не можете использовать SSL, у вас есть проблема с инфраструктурой, которую нужно исправить. Спевать песни и танцевать с шифрованием на стороне клиента, игнорируя фундаментальную проблему обычного текстового трафика, ничего не решает. Таким образом, получить SSL - это ответ. - person deceze♦; 08.11.2010
comment
@Mike Если кто-то говорит, что у него нет безопасного соединения, то ответ наиболее определенно Получите его - 1) Это безопасно, 2) Даже если вы используете собственное решение, которое случается с быть столь же безопасным, это все еще плохая идея поощрять пользователей отправлять конфиденциальную информацию на сайты, которые не используют SSL (или какой-либо другой признанный в отрасли механизм безопасности) - person Justin; 08.11.2010
comment
@Mike Ты следил за представлением Firesheep? Часто злоумышленнику даже не нужно беспокоиться о подделке формы входа! SSL - единственный способ безопасного обмена данными. - person deceze♦; 08.11.2010
comment
Я полностью согласен с вами, ребята, он должен получить SSL-соединение, но это был не его вопрос. Его вопрос был: как мне защитить пароль через незащищенное соединение? Я думаю, что правильный способ ответить на вопрос - это на самом деле ответить на вопрос и объяснить, почему это плохая идея. Когда вы просто говорите людям: это плохая идея. они перестают слушать. Но если вы дадите им веревку, а затем объясните, почему повеситься - плохая идея, они будут слушать, потому что им не кажется, что вы проигнорировали их вопрос. - person ; 08.11.2010
comment
Да, SSL - один из самых надежных способов, но нет, SSL не является решением этого вопроса. Просто потому, что он сказал, что не может, и потому что SSL - не единственный способ (посмотрите на jcryption или дайджест HTTP-аутентификации) ... - person Pascal Qyy; 08.11.2010
comment
Большое спасибо за все ваши ценные комментарии. Он дает много знаний о безопасном общении. Я не говорил, что я не могу использовать HTTPS или SSL. Дело в том, что, насколько я знаю, их немного сложно реализовать, и я понятия не имею, как они реализованы. То, что я искал, - это какой-то механизм шифрования, который не будет каким-либо архитектурным изменением моего приложения. глядя на комментарии, я думаю, что они занимают меньше времени и их легко реализовать, Механизм шифрования (или хеширования) Javascript - плохая идея? - person dinesh senartne; 08.11.2010
comment
@dinesh Добавление HTTPS не потребует какой-либо серьезной переделки вашего сайта, если она вообще потребуется. Используя простой код, вы можете добавить очень простую проверку, чтобы убедиться, что вы используете HTTPS, и перенаправить, если нет. В зависимости от серверного программного обеспечения, которое вы используете, вы можете сделать это в самой конфигурации сервера, поэтому вам вообще не нужно будет менять свой код. В лучшем случае вам может потребоваться добавить одну страницу перенаправления с вашего HTTP на ваш сайт HTTPS, но, опять же, это, вероятно, можно обработать в конфигурации сервера. При этом не помешает также проверка вашего кода на HTTPS. - person ; 08.11.2010
comment
В самом деле? Я не очень разбираюсь в HTTPS, поэтому я так сказал. Если это не потребует дополнительных усилий, я могу использовать его. Я использую Apache Tomcat, и я счастлив знать некоторые дополнительные сведения о том, как на самом деле сделать конфигурацию сервера для HTTPS. - person dinesh senartne; 08.11.2010
comment
Вы можете посмотреть документацию Apache, я надеюсь, это поможет вам: tomcat .apache.org / tomcat-4.0-doc / ssl-howto.html. - person Pascal Qyy; 08.11.2010
comment
Настоящий профессионал в области безопасности не может просто принять и сказать: «ЭЙ, ОН, ГУННА, ПОНИМАЙТЕ ЭТО». Настоящим экспертам необходимо внедрить действующие меры безопасности в доме помимо стандартных. Стандартные меры безопасности всегда взламываются ежедневно, а сообщество об этом не подозревает. - person S To; 18.04.2021

Я перечислил полный код JavaScript для создания MD5 внизу, но это действительно бессмысленно без безопасного соединения по нескольким причинам.

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

Если вы скажете: «Хорошо, я MD5 MD5», вы упускаете суть. Просматривая сетевой трафик или просматривая вашу базу данных, я могу подделать ваш сайт и отправить ему MD5. Конечно, это намного сложнее, чем просто повторно использовать обычный текстовый пароль, но это все еще дыра в безопасности.

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

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

В любом случае вот код JavaScript для создания клиентской части MD5 (не мой код):

/**
*
*  MD5 (Message-Digest Algorithm)
*  http://www.webtoolkit.info/
*
**/

var MD5 = function (string) {

    function RotateLeft(lValue, iShiftBits) {
        return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
    }

    function AddUnsigned(lX,lY) {
        var lX4,lY4,lX8,lY8,lResult;
        lX8 = (lX & 0x80000000);
        lY8 = (lY & 0x80000000);
        lX4 = (lX & 0x40000000);
        lY4 = (lY & 0x40000000);
        lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
        if (lX4 & lY4) {
            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
        }
        if (lX4 | lY4) {
            if (lResult & 0x40000000) {
                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
            } else {
                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
            }
        } else {
            return (lResult ^ lX8 ^ lY8);
        }
    }

    function F(x,y,z) { return (x & y) | ((~x) & z); }
    function G(x,y,z) { return (x & z) | (y & (~z)); }
    function H(x,y,z) { return (x ^ y ^ z); }
    function I(x,y,z) { return (y ^ (x | (~z))); }

    function FF(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function GG(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function HH(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function II(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function ConvertToWordArray(string) {
        var lWordCount;
        var lMessageLength = string.length;
        var lNumberOfWords_temp1=lMessageLength + 8;
        var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
        var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
        var lWordArray=Array(lNumberOfWords-1);
        var lBytePosition = 0;
        var lByteCount = 0;
        while ( lByteCount < lMessageLength ) {
            lWordCount = (lByteCount-(lByteCount % 4))/4;
            lBytePosition = (lByteCount % 4)*8;
            lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
            lByteCount++;
        }
        lWordCount = (lByteCount-(lByteCount % 4))/4;
        lBytePosition = (lByteCount % 4)*8;
        lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
        lWordArray[lNumberOfWords-2] = lMessageLength<<3;
        lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
        return lWordArray;
    };

    function WordToHex(lValue) {
        var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
        for (lCount = 0;lCount<=3;lCount++) {
            lByte = (lValue>>>(lCount*8)) & 255;
            WordToHexValue_temp = "0" + lByte.toString(16);
            WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
        }
        return WordToHexValue;
    };

    function Utf8Encode(string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    };

    var x=Array();
    var k,AA,BB,CC,DD,a,b,c,d;
    var S11=7, S12=12, S13=17, S14=22;
    var S21=5, S22=9 , S23=14, S24=20;
    var S31=4, S32=11, S33=16, S34=23;
    var S41=6, S42=10, S43=15, S44=21;

    string = Utf8Encode(string);

    x = ConvertToWordArray(string);

    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;

    for (k=0;k<x.length;k+=16) {
        AA=a; BB=b; CC=c; DD=d;
        a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
        d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
        c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
        b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
        a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
        d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
        c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
        b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
        a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
        d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
        c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
        b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
        a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
        d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
        c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
        b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
        a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
        d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
        c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
        b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
        a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
        d=GG(d,a,b,c,x[k+10],S22,0x2441453);
        c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
        b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
        a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
        d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
        c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
        b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
        a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
        d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
        c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
        b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
        a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
        d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
        c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
        b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
        a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
        d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
        c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
        b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
        a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
        d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
        c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
        b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
        a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
        d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
        c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
        b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
        a=II(a,b,c,d,x[k+0], S41,0xF4292244);
        d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
        c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
        b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
        a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
        d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
        c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
        b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
        a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
        d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
        c=II(c,d,a,b,x[k+6], S43,0xA3014314);
        b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
        a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
        d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
        c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
        b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
        a=AddUnsigned(a,AA);
        b=AddUnsigned(b,BB);
        c=AddUnsigned(c,CC);
        d=AddUnsigned(d,DD);
    }

    var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);

    return temp.toLowerCase();
}
person Community    schedule 08.11.2010
comment
Без проблем. Меня беспокоит, когда люди не отвечают на вопрос, даже если это плохая идея. Я даже написал об этом в блоге: picklepumpers.com/wordpress/?p=673 - person ; 08.11.2010
comment
@Mike Пожалуйста, позвольте мне указать, что вы разглагольствуете о недостатке коммуникативных навыков, но при этом полностью неверно истолковали требования и знания OP в отношении SSL. Человеческое общение - вещь ужасно ошибочная и хрупкая, коммуникативные навыки должны быть двусторонними. :) - person deceze♦; 08.11.2010
comment
@deceze Спасибо за ответ, и вы правы. Я предположил, что он не может использовать SSL, потому что он сказал, что не использует его. Виноват. Когда судишь других, никогда не больно смотреть на себя. - person ; 08.11.2010
comment
+1 за конструктивный самоанализ. : o) - person deceze♦; 08.11.2010
comment
Здесь нет плохих ответов. Все ваши комментарии, хотя некоторые из них не являются решениями, которых я на самом деле ожидал, тем не менее, они значительно улучшают мои знания. Так что продолжайте публиковать все, что вы думаете, как решение. Еще раз спасибо, Майк :) - person dinesh senartne; 08.11.2010

Вы отметили этот вопрос тегом ssl, и SSL - это ответ. Любопытный.

person user207421    schedule 21.11.2010

Вы также можете просто использовать http://tools.ietf.org/html/rfc2616#section-11 с Дайджест (http://httpd.apache.org/docs/2.2/en/mod/mod_auth_digest.html, Apache Tomcat, и здесь объяснение дайджеста).

Для получения интересной информации о Java взгляните на:

person Pascal Qyy    schedule 08.11.2010
comment
Спасибо. Что проще реализовать, HTTPS или HTTP Digest? - person dinesh senartne; 08.11.2010
comment
Используется ли какой-либо сертификат в механизме HTTP-дайджеста, как в HTTPS? - person dinesh senartne; 08.11.2010
comment
Это зависит. HTTPS и дайджест могут дополнять друг друга. Дайджест - это просто метод аутентификации клиента и проверки его правильного пароля без обмена паролем между сервером и клиентом в виде открытого текста по сети. Для этого не нужен сертификат, потому что он ничего не шифрует и не использует какую-либо асимметричную криптографию. Сервер просто бросает вызов клиенту с помощью криптографических инструментов (например, MD5) для проверки. Если вы посмотрите ссылку Общие сведения об аутентификации при входе (download.oracle. com / javaee / 1.4 / tutorial / doc / Security5.html) вам будет легче с этим справиться ^^ - person Pascal Qyy; 08.11.2010
comment
@dinesh: нет сертификата для HTTP-дайджеста. Дайджест-аутентификация проще для реализации, но 1) вы не можете предоставить удобную форму входа для своих пользователей, 2) она решает только часть аутентификации, но не защищает передаваемые данные (SSL делает). - person Peter Štibraný; 08.11.2010
comment
Для меня дайджест может быть интересен, потому что вам не нужно манипулировать сертификатами, это много работы и / или денег): заплатите за центр сертификации утверждения или разверните сертификат вашего центра сертификации на вашем клиенте, и это приведет к перегрузке вашего сервера ( криптография - это плата за ваш процессор). в среднем 1 клиент SSL стоит 10 клиентов без SSL для нагрузки вашего сервера. НО Дайджест ничего не шифрует! все остальные данные, которыми обмениваются по сети между клиентом и сервером, остаются в открытом виде. Вас должна беспокоить не сложность реализации, а уровень конфиденциальности данных, которыми вы манипулируете. - person Pascal Qyy; 08.11.2010
comment
Например: использовать SSL только для защиты вашего пароля во время аутентификации, когда вы входите в серверную часть CMS для загрузки общедоступных данных, бесполезно (потому что он также шифрует данные во время загрузки, пока они будут общедоступными ...) . Но в веб-приложении, которое обрабатывает личные данные вашего общества, это имеет смысл! - person Pascal Qyy; 08.11.2010
comment
@Peter Štibraný: Можно предоставить удобную форму входа с HTTP-аутентификацией: http://www.peej.co.uk/articles/http-auth-with-html-forms.html. - person Pascal Qyy; 08.11.2010
comment
@ G.Qyy: Интересно, насколько хорошо это работает на практике. Также было бы интересно узнать, отправляет ли XMLHttpRequest имя пользователя / пароль через базовую аутентификацию в первом запросе или нет (вы, конечно, не хотите этого, конечно), или будут ли последующие запросы браузера использовать те же учетные данные. Также кажется, что если вы укажете неправильное имя пользователя / пароль и ответ сервера с кодом 401, вы получите стандартный диалог браузера, а не вашу страницу. Спасибо, что указали на эту статью. - person Peter Štibraný; 08.11.2010
comment
@Peter Štibraný: вы прочитали всю статью? особенно: Обновление: Трэвис Эстилл и Дэвид Кляйншмидт напомнили мне, что 401 ответ не должен возвращаться без заголовка Auth, поэтому 403 - лучший код ответа. Это также помогает заставить Safari вести себя хорошо. - person Pascal Qyy; 08.11.2010
comment
@ G.Qyy: в документации для 403 говорится: сервер понял запрос, но отказывается его выполнить. Авторизация не поможет и запрос НЕ ДОЛЖЕН повторяться. Я не понимаю, почему это лучший код ответа на неправильное имя пользователя / пароль. Но вы правы, я не читал его полностью, просто бегло просмотрел, чтобы составить представление о предлагаемом решении. Если бы я использовал это, я бы немного больше играл с ним самостоятельно. - person Peter Štibraný; 08.11.2010
comment
@Peter Štibraný: И док говорит, что 401 ответ не должен возвращаться без заголовка Auth. А зачем повторять запрос с неверной аутентификационной информацией? 401 попросить браузер обработать задачу, что было передано в JS ... Что бы я не одобрял такого рода метод, я просто сказал, что это возможно. В любом случае, разве хорошая форма входа в систему не менее важна, чем безопасность и производительность, и то, и другое в простоте? - person Pascal Qyy; 08.11.2010
comment
@ G.Qyy: Я все больше и больше запутываюсь ;-) Сервер, конечно же, будет включать заголовок Auth, я не говорил, что этого не должно быть. Но когда запрос приходит на сервер, и этот запрос имеет неверные учетные данные, сервер должен что-то ответить ... Я просто говорю, что 401 - это адекватный ответ, imho. Я чувствую, что мы не во мнении, просто не понимаем друг друга :-) - person Peter Štibraný; 08.11.2010
comment
Да, 401 - адекватный ответ. Поскольку HTTP-аутентификация более адекватна, чем изобретать велосипед только для красивой формы ^^. На этом этапе, если хорошая форма так важна, я предпочитаю отправлять 403 вместо 401, а не использовать какую-то ненадежную реализацию для аутентификации, такую ​​как сеансы PHP ... - person Pascal Qyy; 08.11.2010

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

Более распространенное решение - использовать HTTPS. С HTTPS шифрование SSL согласовывается между вашим веб-сервером и клиентом, прозрачно шифруя весь трафик.

person Zack Bloom    schedule 08.11.2010
comment
Он не может использовать HTTPS. Об этом он говорит в своем ответе. - person ; 08.11.2010
comment
@MikeBethany Он ничего не говорит ни в своем ответе, ни где-либо еще. - person user207421; 26.03.2016
comment
Сервер расшифровывает шифрование SSL, превращая искаженный текст обратно в обычный текст. Конечно, SSL избавляет вас от посторонних глаз в эфире, но не мешает серверу получить пароль в виде обычного текста. - person Jarett Lloyd; 22.03.2019

Для аналогичной ситуации я использовал этот PKCS # 5: стандарт криптографии на основе пароля из лабораторий ОГА. Вы можете избежать сохранения пароля, заменив его чем-то, что можно сгенерировать только из пароля (в одном предложении). Есть несколько реализаций JavaScript.

person Dimitrios Mistriotis    schedule 08.11.2010