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!
TOP Muito Bom! , Funciona perfeitamente.