“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]