2012-01-23 1 views
2

У меня есть существующий веб-сайт asp.net, построенный с использованием мастер-страниц, и что мне нужно скрыть или зашифровать все значения строк запроса запроса в общем месте, не меняя много кода.Шифровать или скрыть QueryString на веб-сайте Asp.net с использованием .net 3.5

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

Спасибо.

+0

Какой уровень обфускации вам нужен? Параметры строки запроса всегда будут отображаться в той или иной форме, если они не будут полностью исключены. – RedFilter

+0

Мне нужно обфускать все значения строк запроса, которые я передаю между страницами по соображениям безопасности. –

ответ

4

Зачем вы хотите зашифровать строку запроса? Если вы пытаетесь отправить конфиденциальную информацию из браузера на сервер, используйте SSL. Если вы попытаетесь зашифровать его самостоятельно, вы обязательно будете проваливаться каким-то тонким способом. Не заново изобретайте колесо.

+0

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

+0

С кем вы пытаетесь скрыть это? Пользователь браузера? Или какой-либо другой объект (например, хакер, человек в середине, правительственный субъект и т. Д.)? –

+0

наверняка пользователь. –

7

Что Крис сказал в своем ответе абсолютно правильно. Я бы согласился с этим в ответ, если он подходит.

Первый вопрос: вы, , нуждаетесь в, чтобы использовать строку запроса, если вы скрываете ее от пользователя? Возможно, что-то вроде Session State лучше избегать, когда пользователь видит его в первую очередь.

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

Вы можете зашифровать строку запроса, в вашем случае я бы использовал DPAPI, поэтому вам не нужно беспокоиться о трудных вещах, таких как управление ключами. Вот пример использования:

public static string Encrypt(string val) 
    { 
     var bytes = System.Text.Encoding.UTF8.GetBytes(val); 
     var encBytes = System.Security.Cryptography.ProtectedData.Protect(bytes, new byte[0], System.Security.Cryptography.DataProtectionScope.LocalMachine); 
     return Convert.ToBase64String(encBytes); 
    } 


    public static string Decrypt(string val) 
    { 
     var bytes = Convert.FromBase64String(val); 
     var encBytes = System.Security.Cryptography.ProtectedData.Unprotect(bytes, new byte[0], System.Security.Cryptography.DataProtectionScope.LocalMachine); 
     return System.Text.Encoding.UTF8.GetString(encBytes); 
    } 

Вы должны добавить ссылку на System.Security сборки и импортировать пространство имен System.Security.Cryptography.

Вот пример того, как использовать его на странице:

Response.Redirect("~/somepage.aspx?data=" + Server.UrlEncode(Encrypt("SomeSensitiveData"))); 

И чтобы расшифровать его:

var data = Decrypt(Request.QueryString["data"]); 

Вы можете использовать это, чтобы зашифровать значение строки запроса, такие как Encrypt и используйте Decrypt на странице, которая должна интерпретировать строку запроса.

Вы можете использовать это в дополнение к SSL; что является хорошей идеей. Это также означает, что пользователь не сможет увидеть значения строки запроса.

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

Если строки запроса необходимо сохранить (например, для закладок), и это не просто «временное» использование, тогда вам нужно будет найти общий ключ, сохранить его где-нибудь в безопасности и сделать шифрование себя с чем-то вроде AES.

+0

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

+0

@AmrElnashar Вам придется изменить код. В этом случае нет серебряной пули. Вы * можете * сделать что-то глупое, как написать HTTP-модуль для IIS; или посмотреть, доступен ли коммерческий вариант. – vcsjones