Manchmal möchte man den QueryString einer Webanwendung verschlüsseln, damit Manipulationen ausgeschlossen werden können.
In einem VB-Forum kursierte eine Klasse zum Verschlüsseln von Strings, diese habe ich in C# konvertiert.
Damit diese Methoden auch für Querystrings funktionieren (Stichwort Leerzeichen und ‚+‘) habe ich die entsprechenden Methoden angepasst:
namespace BSP.FrontEnd.Utils
{
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Web;
/// <summary>
/// Class for encryption
/// </summary>
public class Encryption64
{
/// <summary>
/// Key for encryption
/// </summary>
private byte[] key = { };
/// <summary>
///
/// </summary>
private byte[] iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
/// <summary>
/// Decrypts a string
/// </summary>
/// <param name="valueToDecrypt">String to decrypt</param>
/// <param name="encryptionKey">key for decryption</param>
/// <returns>decrypted string</returns>
public string Decrypt(string valueToDecrypt, string encryptionKey)
{
valueToDecrypt = HttpUtility.UrlDecode(valueToDecrypt);
//// change ' ' back to '+'
valueToDecrypt = valueToDecrypt.Replace(' ', '+');
byte[] inputByteArray = new byte[valueToDecrypt.Length + 1];
try
{
this.key = System.Text.Encoding.UTF8.GetBytes(Left(encryptionKey, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
inputByteArray = Convert.FromBase64String(valueToDecrypt);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(this.key, this.iv), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
return encoding.GetString(ms.ToArray());
}
catch (Exception e)
{
return e.Message;
}
}
/// <summary>
/// Encrypts a string
/// </summary>
/// <param name="valueToEncrypt">String to encrypt</param>
/// <param name="encryptionKey">key for encryption</param>
/// <returns>encrypted string</returns>
public string Encrypt(string valueToEncrypt, string encryptionKey)
{
try
{
this.key = System.Text.Encoding.UTF8.GetBytes(Left(encryptionKey, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(valueToEncrypt);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(this.key, this.iv), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
string encrypt = Convert.ToBase64String(ms.ToArray());
encrypt = HttpUtility.HtmlEncode(encrypt);
return encrypt;
}
catch (Exception e)
{
return e.Message;
}
}
/// <summary>
/// String function
/// </summary>
/// <param name="s">string input</param>
/// <param name="len">lenght of output</param>
/// <returns>returns SubString</returns>
private static string Left(string s, int len)
{
if (len == 0 || s.Length == 0)
{
return String.Empty;
}
else if (s.Length <= len)
{
return s;
}
else
{
return s.Substring(0, len);
}
}
}
}
Die Verwendung dieser Methoden funktioniert innerhalb der ASP.NET Dateien ziemlich einfach:
Die Funktion EncryptQueryString erhält alle Parameter und Werte die verschlüsselt werden sollen, z.B. rubrik=9&ID=201, und gibt diese Zeichenkette wieder verschlüsselt zurück:
private static string EncryptQueryString(string queryString)
{
Encryption64 oES = new Encryption64();
return oES.Encrypt(queryString, Constants.ENCRYTION_KEY);
}
Diese verschlüsselte Zeichenkette wird nun anstatt der tatsächlichen Parameter als ID übergeben.
Die Parameter werden mit der Methode wieder entschlüsselt:
protected void DecryptQueryString()
{
Encryption64 oES = new Encryption64();
string queryString = Convert.ToString(Request.QueryString["ID"], CultureInfo.CurrentCulture);
if (!String.IsNullOrEmpty(queryString))
{
queryString = oES.Decrypt(queryString, Constants.ENCRYTION_KEY);
string[] variables = queryString.Split('&');
if (variables.Length > 1)
{
this.group = variables[0].Split('=')[1];
this.id = Convert.ToInt32(variables[1].Split('=')[1], CultureInfo.CurrentCulture);
this.headline = variables[2].Split('=')[1];
if (variables.Length > 3)
{
this.variabel = variables[3].Split('=')[1];
}
}
}
}