クエリ文字列を使用してページの周りにいくつかの値を渡すアプリがあります。クエリ文字列の値を暗号化する方法の例はほとんど見つかりませんでしたが、問題は、キーがクエリ文字列について詳しく説明し、すべて整数である値が文字列に変換されることです。
キーとキー値を含むASP.NETのクエリ文字列全体を暗号化する方法はありますか?
何かのようなもの:
Default.aspx?value1=40&value2=30&value3=20
に
Default.aspx?56sdf78fgh90sdf4564k34klog5646l
ありがとう!
ウェブ上には多くの例があります。
それらのいくつか:
asp.netでクエリ文字列を暗号化するにはどうすればよいですか?
http://www.codeproject.com/Articles/33350/Encrypting-Query-Strings
http://www.keyvan.ms/how-to-encrypt-query-string-parameters-in-asp-net
http://forums.asp.net/t/989552.aspx/1
ここで、キーも暗号化するのが好きだと言います。実際に行う必要があるのは、すべてのURL行を暗号化することです。次に、RawUrlを読んだ後はどうなりますか?そしてそれを解読します。
上記の参照の多くが見落としている問題が1つあります。それは、暗号化された文字列を返す直前のURLエンコードです(文字列が返される直前に以下を参照してください)。私はIIS 7.5を使用していますが、文字列を自動的に「デコード」するので、復号化は「OK」であるはずです。暗号化コードと復号化コードの両方を以下に示します。
public string EncryptQueryString(string inputText, string key, string salt)
{
byte[] plainText = Encoding.UTF8.GetBytes(inputText);
using (RijndaelManaged rijndaelCipher = new RijndaelManaged())
{
PasswordDeriveBytes secretKey = new PasswordDeriveBytes(Encoding.ASCII.GetBytes(key), Encoding.ASCII.GetBytes(salt));
using (ICryptoTransform encryptor = rijndaelCipher.CreateEncryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)))
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
{
cryptoStream.Write(plainText, 0, plainText.Length);
cryptoStream.FlushFinalBlock();
string base64 = Convert.ToBase64String(memoryStream.ToArray());
// Generate a string that won't get screwed up when passed as a query string.
string urlEncoded = HttpUtility.UrlEncode(base64);
return urlEncoded;
}
}
}
}
}
public string DecryptQueryString(string inputText, string key, string salt)
{
byte[] encryptedData = Convert.FromBase64String(inputText);
PasswordDeriveBytes secretKey = new PasswordDeriveBytes(Encoding.ASCII.GetBytes(key), Encoding.ASCII.GetBytes(salt));
using (RijndaelManaged rijndaelCipher = new RijndaelManaged())
{
using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)))
{
using (MemoryStream memoryStream = new MemoryStream(encryptedData))
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
{
byte[] plainText = new byte[encryptedData.Length];
cryptoStream.Read(plainText, 0, plainText.Length);
string utf8 = Encoding.UTF8.GetString(plainText);
return utf8;
}
}
}
}
}