‚ÄúOl√° pessoal, antes de tudo gostaria de agradecer o time da Microsoft, nesse dia 01 de julho de 2009 eu virei MVP Microsoft de Bras√≠lia. Espero poder ajudar muito esse time com palestras, artigos, v√≠deos e muito mais.‚ÄĚ

Voltando para o nosso artigo, hoje em dia com a facilidade da web 2.0, sistemas web e serviços web; precisamos preocupar com a parte de segurança de software e rede. O que irei falar no decorrer do artigo é; explicar porque criptografar url, como criptografar a url com .NET e o passo a passo com figuras e exemplos.

Referência
Ferramenta: Visual Studio .NET 2008
Componte: DLL CriptQuery
Linguagem: C#.NET
Nível: Avançado

Introdução
Para começar; no meu ponto de vista precisamos muito de ter segurança de dados, software e rede. O foco principal é ter segurança nos softwares que desenvolvo e gerencio. Estava vendo na internet um vídeo onde os Crackers invadiram os dados e deixaram uma cidade toda, isto é, a maior cidade do mundo conectada a internet fora do ar. O título do vídeo é: O maior cyberataque do Planeta.[1] Segue uma parte da notícia:

‚ÄúVeja como a Est√īnia, pa√≠s mais conectado do mundo, ficou offline por dias. Voc√™ pode se surpreender mas a Est√īnia, pequeno pa√≠s do Leste europeu e ex-membro da antiga Uni√£o Sovi√©tica, √© o pa√≠s mais conectado do mundo. E foi este o cen√°rio que crackers russos escolheram para promover o maior cyberataque do mundo. Em 2007, o pa√≠s se viu sem possibilidade de conex√£o a bancos, ve√≠culos de comunica√ß√£o, p√°ginas do Governo. At√© o servi√ßo nacional de emerg√™ncia (o equivalente ao nosso 190) parou de funcionar. Veja exatamente o que aconteceu e como eles deram a volta por cima nessa hist√≥ria.‚ÄĚ [2]

Para quem vê a notícia pelo vídeo, nota que uns Crackers assumiram o ataque e nem o Governo Americano conseguiu fazer nada sobre essa invasão.
Toda essa notícia surgiu devido a falta de segurança, pode ser no software, rede ou dados. Como desenvolvedor de software, preciso garantir que o meu sistema pode ser organizado e seguro mesmo que um Hacker consiga invadir o servidor onde está hospedado o software web / site. Mesmo que consiga abrir o banco de dados, o invasor terá mais um impedimento, você pergunta, - qual impedimento?, - o impedimento de criptografia de dados dentro do banco de dados.

O mínimo possível de segurança deve ser feito quando desenvolvo algum aplicativo web. E o que vou mostrar é uma criptografia de url para ativação de usuário, por exemplo: Imagine que você tem um site na internet com cadastro completo. O melhor coisa depois do usuário cadastrar o seu e-mail com seus dados, é pedir a ativação do mesmo mandando um e-mail para a sua caixa postal automaticamente.

Explicação do Problema
Até agora, não tem nada de novo com isso, só que dependendo do link que enviar; caso o usuário saiba mais um pouco de computador, tecnologia da informação, ele pode ativar outros usuários inválidos.

Isso porque o link pode ser alterado simplesmente trocando as letras ou n√ļmeros, por exemplo: um link www.SITE.com.br/cadastro/ativar.aspx?usu=email@email.com. Este link √© uma id√©ia de que geralmente recebemos quando preencho um cadastro n√£o seguro. Eu nem mesmo estou contando com https, ssl e outros par√Ęmetros de rede. Voc√™ concorda comigo que eu posso colocar outro e-mail no local de email@email.com e ativar outro e-mail que n√£o seja o meu? Se o link for www.SITE.com.br/cadastro/ativar.aspx?chave=12 eu posso trocar o n√ļmero sem problema e ativar outro cadastro que n√£o seja o meu. Tudo isso pode ser evitado se utilizar criptografia na url e a mesma verificada. O pr√≥ximo passo ser√° mostrar o exemplo passo a passo.

Exemplo de Código
O link gerado para ativar o usu√°rio foi esse:
http://localhost:2772/criptografiaUrl.aspx?chave=s6GjQ2BpS3RjCN33Uy36XGOTzXjbYFmVegl
JflWbakkXRjOOHjxZSCvTHxZJ32FQ%2bJn5Eehlb8
LRra1qQS2k%2fg%3d%3d

Ao tentar acessar esse link para ativar o cadastro, a criptografia é verificada e no caso de ser inválida uma mensagem é mostrada.

Abri o Visual Studio .NET 2008 e adicionei como references a dll utilizada, chamada CriptQuery. (imagem 1.1)


Imagem 1.1

Note que a figura 1.1 mostra selecionado a dll referenciada, além de outras também mas, o que foi usado foi apenas a selecionada.
A √ļnica que fiz foi: gerar um e-mail e gerar uma url (Code 1.1).

protected void Page_Load(object sender, EventArgs e)
{
if (Request["chave"] == null)
{
CriptQuery.SecureQueryString sec = new SecureQueryString();
sec["email"] = "mauricio@abc.com.br";
Response.Redirect("http://localhost:2772/criptografiaUrl.aspx?chave=" + sec.ToString());
}
}

Code 1.1
Explicação:
No Page_Load da p√°gina verifiquei se o par√Ęmetro chavei estava sendo passada, se for igual a null, criei uma inst√Ęncia chamada sec. CriptQuery.SecureQueryString sec = new SecureQueryString();
Ap√≥s a inst√Ęncia criada, gerei um array com o nome de email dentro de sec instanciado. Igualei o mesmo ao e-mail que gostaria de criptografar, ou seja, o e-mail que preciso ativar junto ao sistema. Esse link no final seria enviado via e-mail ao usu√°rio. sec["email"] = "mauricio@abc.com.br";
A pr√≥xima linha foi gerar uma url passando como par√Ęmetro a chave e a vari√°vel sec.ToString(). Response.Redirect("http://localhost:2772/criptografiaUrl.aspx?chave=" + sec.ToString());


Imagem 1.2

A imagem 1.2 mostra apenas como ficou o código.
Depois de criar código (code 1.1) executei o código e me mostrou um resultado. (Imagem 1.3)


Imagem 1.3
Note a criptografia feita no topo da p√°gina.
O próximo passo é clicar no botão enviar e descriptografar o dado mostrando na página.

Descriptogrando URL
Para descriptografar, preciso pegar o dado e enviar como par√Ęmetro de entrada na inst√Ęncia. (Code 1.2)

private void descriptografar(string p)
{
try
{
CriptQuery.SecureQueryString sec = new SecureQueryString(p);
Response.Write(sec["email"].ToString());
}
catch (Exception ex)
{
Response.Write("URL Inv√°lida " + ex.Message);
}
}

Code 1.2
Explicação:
Note que gerei um novo m√©todo privado que n√£o retorna valor e recebe uma string na entrada do m√©todo. O passo seguinte foi colocar dentro do try uma nova inst√Ęncia e com uma diferen√ßa, isto √©, enviando no final da inst√Ęncia o par√Ęmetro de entrada. CriptQuery.SecureQueryString sec = new SecureQueryString(p);

Depois, escrevi na tela o resultado do array criado anteriormente, ou seja, com o mesmo nome Response.Write(sec["email"].ToString());
Na página principal, gerei um botão que acessa esse método descriptografar e veja o que apareceu na tela. (Imagem 1.4)


Imagem 1.4

Se alterar alguma informa√ß√£o da url criptografada, ou seja, do par√Ęmetro criptografado e clicar no bot√£o Enviar, aparece automaticamente uma mensagem falando da invalidade da url. (Imagem 1.5)


Imagem 1.5

Todo o controle est√° junto da dll adicionada dentro do projeto.
Eu fico por aqui e qualquer d√ļvida pode entrar em contato.

Referência:
[1]Olhar Digital - www.olhardigital.com.br
[2]Vídeo Olhar Digital - [http://olhardigital.uol.com.br/central_de_videos/video_wide.php?id_conteudo=8514]