2013-05-28 6 views
1

Клиент должен быть аутентифицирован сервером, поэтому ему необходимо отправить учетные данные. Учетные данные могут храниться в клиентской базе данных, как в зашифрованном виде. Поскольку сертификат сервера известен, для обеспечения лучшей безопасности клиент может использовать открытый ключ сервера для шифрования пароля. Но проблема в том, как отправить пароль без двойного шифрования.Отправка предварительно зашифрованных данных через SSL

Например, предположим, что URL-адрес аутентификации сервера «https://example.com/a?u=user&p=password», поэтому клиенту необходимо отправить SSL-зашифрованные данные этой строки на сервер. Поскольку клиент хранит только зашифрованный пароль, он должен найти способ отправить ssl_encrypt("https://example.com/a?u=user&p=")+pre_encrypted_password в целом на сервер.

Клиент использует WinHTTP api, так есть ли способ достичь этого?

+1

Хороший ответ, но я хотел бы отметить, что есть одна мотивация для предварительного шифрования пароля, хотя результат эквивалентен паролю: в случае, если один и тот же пароль используется для разных сервлетов. Поскольку исходный пароль больше не известен, его невозможно изучить и попробовать на других сайтах. Это похоже на предварительное вычисление статического HA1 в аутентификации дайджеста, а затем «забывание» исходных входов (имя пользователя, область, пароль). – Celada

+0

@ Celada Я думаю, что вы должны прокомментировать ответ, а не вопрос;) –

+0

@Celada В любом случае вы просто говорите точно, чего я пытаюсь достичь. В идеале я надеялся сделать это без изменения существующего кода сервера. Но похоже, что из-за фактов SSL это невозможно сделать. –

ответ

4

Нет. SSL не работает, так как данные, передаваемые по SSL-соединению, шифруются с использованием симметричного криптографического алгоритма (обычно AES, RC4 или аналогичного) с использованием ключа, который устанавливается во время первоначального установления связи SSL. Открытый/закрытый ключ сервера используется только во время первоначального рукопожатия; после этого они не используются.

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

0

Потенциально вы можете сохранить сертификат, отправленный сервером (при условии, что этот сертификат имеет ключ RSA, который разрешает шифрование), а затем использовать его в шифровании PKCS # 7 ваших данных и отправлять зашифрованные данные на сервер. Возникает еще один вопрос: имеет ли серверный код доступ к сертификату. Это не так во многих конфигурациях. Таким образом, сервер не сможет расшифровать данные.

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

+0

Дополнительная защита предназначена для локального предотвращения взлома клиента, а не для сетевого трафика или атаки «человек в середине». –