2010-02-22 2 views
2

Мне нужно отправить запрос POJAJAX на мой сервер.с использованием открытых/закрытых ключей в javascript

Мне нужно убедиться, что запрос возник из самого скрипта, а не от пользователя, который пишет запрос сам. Есть ли безопасный способ сделать это? Может ли сценарий подписывать или кодировать запрос POST, а затем расшифровываться секретным ключом сервера? и могу ли я каким-то образом запретить пользователю шифровать с помощью моего открытого ключа?

Я не делаю этого только для фильтрации, так что простая старая проверка на стороне сервера просто не будет.

+0

Почему не выполняется обычная проверка на стороне сервера? – deceze

+0

Я делаю это для расширения браузера, а не для веб-сайта .. Мне нужно выталкивать материал на сервер, но мне нужно знать, что ** im ** отправляет запрос, а не кому-то еще. – daniel

+0

То же самое. Даже если ваше расширение было скомпилированным двоичным кодом (кроме его разборки), можно было нюхать необработанные данные, отправляемые и повторять то же самое требование. Сервер не мог сказать разницы. Когда код на клиенте, все ставки отключены. – deceze

ответ

5

Другие ответы верны: это принципиально невозможно. Вероятно, лучшее, что вы можете сделать с прагматической точки зрения, - это взглянуть на действительно противные способы запутать ваш JavaScript, чтобы препятствовать людям, которые могли бы попытаться это посмотреть, но вы можете быть уверены, что кто-то мотивированный может обойти это без особых усилий , http://en.wikipedia.org/wiki/Obfuscated_code

-2

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

+0

Это совершенно неправильно. Предполагая, что вы реализовали AES или что-то в javascript, тогда было бы вполне возможно зашифровать данные для отправки обратно на сервер: вы используете открытый ключ для его шифрования, а затем только сервер может расшифровать его, используя закрытый ключ. Конечно, это было бы бесполезным упражнением.Это не защитит от подделок пользователей, и было бы гораздо проще использовать HTTPS для защиты данных в пути в любом случае. –

+0

@Marc B. Прежде всего, AES является симметричным ключом, а не асимметричным (вы можете использовать симметричный ключевой шифр как/часть/криптосистемы с открытым ключом, но вам все равно нужен асимметричный шифр, такой как RSA). Во-вторых, ОП спросил: «Может ли сценарий подписывать или кодировать запрос POST», а также «я должен знать, что я отправил запрос». Несмотря на ошибочную ссылку на «закрытый ключ сервера», он явно спрашивает, как разрешить клиенту/знаку/данным, а не как/encrypt/it. –

+0

Да, но он также говорит, что «расшифрован личным ключом сервера». Подписание или шифрование, в любом случае, возможно из javascript, но опять же, тривиально обходить и подделывать. –

9

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

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

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

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

4

мне нужно, чтобы убедиться, что запрос возник из сценария самих, а не от пользователя писать запрос его/ее собственный.

С точки зрения вашего сервера «сценарий» и «пользователь» неразличимы. То, что вы просите, принципиально невозможно.

+0

+1 Очень красиво. – deceze