Criptografar querystring ASP NET MVC

Olá pessoal!

Algumas vezes precisamos transmitir alguma informação via querystring e que não gostaríamos de deixar a informação de forma explícita na URL. Uma forma fácil de “ocultarmos” a informação é através da criptografia da querystring. Lembrando que este recurso é apenas para reforçar a segurança do seu site. Nunca deixe de fazer as validações do lado do servidor.
Para este exemplo vamos utilizar o template de projeto ASP NET MVC.

Na HomeController modifique o a action Index e crie um ActionResult e adicione uma View para receber um id e um param como string:

public ActionResult Index()
{
	ViewBag.Id = CriptografiaHelper.EncryptQueryString("1");
	ViewBag.Param = CriptografiaHelper.EncryptQueryString("teste");
	return View();
}

public ActionResult SegundaPagina(string id, string param)
{
	ViewBag.IdDescriptografado = CriptografiaHelper.DecryptQueryString(id);
	ViewBag.ParamDescriptografado = CriptografiaHelper.DecryptQueryString(param);
	return View();
}

Crie uma pasta chamada helpers (ou qualquer outro nome) e crie uma classe chama estática chamada CriptografiaHelper. Essa classe será responsável por criptografar e descriptografar os dados da query string.
Coloque o seguinte código na classe criada:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

/// 
/// Classe estática utilizada para criptografar a querystring
/// 
public static class CriptografiaHelper
{
    const string encryptionKey = "CH4V3"; //Coloque aqui uma chave única

    /// 
    /// Método para criptografar os dados da querystring
    /// 
    /// 
    /// 
    public static string EncryptQueryString(string clearText)
    {
        byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
        using (Aes encryptor = Aes.Create())
        {
            var pdb = new Rfc2898DeriveBytes(encryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }
                clearText = Convert.ToBase64String(ms.ToArray());
            }
        }
        return clearText;
    }

    /// 
    /// Método para criptografar os dados da querystring
    /// 
    /// 
    /// 
    public static string DecryptQueryString(string cipherText)
    {
        cipherText = cipherText.Replace(" ", "+");
        byte[] cipherBytes = Convert.FromBase64String(cipherText);
        using (Aes encryptor = Aes.Create())
        {
            var pdb = new Rfc2898DeriveBytes(encryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(cipherBytes, 0, cipherBytes.Length);
                    cs.Close();
                }
                cipherText = Encoding.Unicode.GetString(ms.ToArray());
            }
        }

        return cipherText;
    }
}

Na Index.cshtml coloque o seguinte código na página:

@Html.ActionLink("Segunda página", "SegundaPagina", "Home", new { id = ViewBag.Id, param = ViewBag.Param }, null)

E na SegundaPagina.cshtml o seguinte código:

@ViewBag.IdDescriptografado
@ViewBag.ParamDescriptografado

Execute o projeto e clique no link. A url será exibida da seguinte forma:

http://localhost:0000/Home/SegundaPagina/otj88HlnkcUpzUiyuALPGQ%3d%3d?param=taDmNIZW9xDWjZxBAyTG4A%3D%3D

Este foi apenas um simples exemplo de como criptografar query string. Neste exemplo utilizei ViewBag, mas você pode utilizar o mesmo conceito em uma viewmodel por exemplo.

Para fazer o download do projeto em MVC 5 clique aqui.

um abraço e até a próxima!