{
Content.Append(HttpUtility.UrlEncode(key));
Content.Append("=");
Content.Append(HttpUtility.UrlEncode(base[key]);
Content.Append("&"};
}
// Удалить последний '&'
Content.Remove(Content.Length-1, 1);
...
Следующий шаг — использовать класс ProtectData для шифрования данных. Этот класс применяет DPAPI для шифрования информации и метод Protect для возврата байтового массива, так что потребуется предпринять дополнительные шаги для преобразования байтового массива в строку, подходящую для строки запроса. Один из подходов, который кажется разумным — применить статический метод Convert.ToBase64String(), который создает закодированную Ваае64 строку. К сожалению, строки Base64 могут включать символы, недопустимые для строки запроса (и именно — знак равенства). Хотя вы можете создать строку Base64, а потом подвергнуть ее URL-кодированию, это излишне усложнит стадию расшифровки. Проблема состоит в том, что метод ToBase64String() может также вставить серии строк, которые выглядят как URL-кодированные последовательности символов. Такие последовательности затем будут неправильно заменены в процессе декодирования.
Более простой подход — использовать другую форму кодирования. В этом примере применяется шестнадцатеричное кодирование, при котором каждый символ заменяется его буквенно-цифровым кодом. В примере не показаны методы для шестнадцатеричного кодирования, но они доступны в составе загружаемого кода.
// Зашифровать содержимоег используя DPAPI
byte[] EncryptedData = ProtectedData.Protect(
Encoding.UTF8.GetBytes(Content.ToString()),
null, DataProtectionScope.localMachine);
// Преобразовать зашифрованный байтовый массив в допустимую строку URL.
// Это может быть подходящим местом для проверки данных
// на предмет того, что они не превышают типичного размера в 4 Кбайт
return HexEncoding.GetString(EncryptedData);
}
Строку, возвращенную EncryptedQueryString.ToString() можно поместить непосредственно в строку запроса, используя метод Response.Redirect(). Целевая страница, которая принимает данные запроса, нуждается в способе десериализации и дешифровки строки. Первый шаг — создать объект EncryptedQueryString и передать зашифрованные данные, ^тобы облегчить этот шаг, имеет смысл добавить новый конструктор в класс EncryptedQueryString, который примет параметр — зашифрованную строку, как показано ниже:
public EncryptedQueryString(String encryptedData)
{
// Расшифровать переданные данные с DPAPI
byte[] RawData = HexEncoding.GetBytes(encryptedData);
byte[] ClearRawData = ProtectedData.Unprotect(
RawData, null, DataProtectionScope.LocalMachine);
string StringData = Encoding.UTF8.GetString(ClearRawData);
предыдущая следующая страница вначало главы оглавление
1021