{
    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

Hosted by uCoz