segunda-feira, 6 de setembro de 2010

[Akita Responde] Começando com Ruby on Rails

Se alguém está como eu, sem saber por onde começar a estudar Ruby (on Rails), pode dar uma olhada nessas dicas do Akita, http://akitaonrails.com/2010/06/21/akita-responde-comecando-com-ruby-on-rails. Ele cita várias referências. Entre elas, o Aprenda a Programar, pra quem quer começar a programar já com Ruby e o O Guia (Comovente) de Ruby do Why.

quarta-feira, 1 de setembro de 2010

Segredinhos do Chrome

O Chrome desde seu lançamento é elogiado pela agilidade na navegação, mas muita gente ainda usa o Firefox, que apesar de mais lento, possui ótimos recursos, os famosos add-ons. Mas o fato é que o Chrome anda dando uma melhorada nas suas funções. Recentemente - e meio sem querer - descobri que o Chrome tem uma espécie de firebug embutido. Funciona assim, clique com o botão direito na página e vá em "Inspecionar elemento":



Então abra-se uma janela com várias informações sobre a página, desde o rss e html até os cookies da página.



Vantagens: O visual é bacana e ele apresenta funções a mais que o Firebug
Desvantagens: Ainda não descobri qual é o atalho para abrir a inspeção

quinta-feira, 26 de agosto de 2010

Criptografia utilizando JAVA e .NET

Um problema recorrente aqui no laboratório é a troca de dados sensíveis entre sistemas que utilizam tecnologias diferentes. Resumindo o problema:

  • Trata-se de informação sensível;

  • A informação, muitas vezes, trafega por redes inseguras e vulneráveis;

  • Os sistemas interessados utilizam tecnologias diferentes.


A ideia aqui é utilizar3DES, um algoritmo de chave simétrica ao mesmo tempo seguro e suportado pela maioria das tecnologias atuais. Antes de continuar com a solução, vamos dar uma olhada no exemplo de classes JAVA e .NET(C#) compatíveis entre si.

Java:

public class Cipher3DES {

SecretKeySpec chave;
IvParameterSpec iv;
Cipher cifrador;

public Cipher3DES(String key, String initializationVector) throws Exception {
cifrador = Cipher.getInstance("DESede/CBC/PKCS5Padding");
chave = new SecretKeySpec(key.getBytes("UTF8"), "DESede");
iv = new IvParameterSpec(initializationVector.getBytes());
}

public String encryptText(String original) throws Exception {
byte[] plaintext = original.getBytes("UTF8");
cifrador.init(Cipher.ENCRYPT_MODE, chave, iv);
byte[] cipherText = cifrador.doFinal(plaintext);
return new String(Base64Coder.encode(cipherText));
}

public String decryptText(String hidden) throws Exception {
byte[] hiddentext = Base64Coder.decode(hidden.toCharArray());
cifrador.init(Cipher.DECRYPT_MODE, chave, iv);
byte[] originalText = cifrador.doFinal(hiddentext);
return new String(originalText);
}
}

Exemplo de uso:

Cipher3DES c = new Cipher3DES("012345678901234567890123", "01234567");
String segredo = "Frase que não deve ser lida";
String escondido = c.encryptText(segredo);
String original = c.decryptText(escondido);

.NET(C#):

public class Cipher3DES{

TripleDESCryptoServiceProvider tdes;

public Cipher3DES(string chave, string iv){
if (chave.Length != 24)
throw new Exception("Chave de criptografia deve ter tamaho 24");
if (iv.Length != 8)
throw new Exception("Vetor de inicialização deve ter tamaho 8");

tdes = new TripleDESCryptoServiceProvider();
tdes.Key = Encoding.UTF8.GetBytes(chave);
tdes.IV = Encoding.UTF8.GetBytes(iv);
}

public string encryptText(string textToEncrypt){
byte[] buffer = Encoding.UTF8.GetBytes(textToEncrypt);
return Convert.ToBase64String(tdes.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length));
}

public string decryptText(string textToDecrypt){
byte[] buffer = Convert.FromBase64String(textToDecrypt);
return Encoding.UTF8.GetString(tdes.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length));
}
}

Exemplo de uso:

Cipher3DES c = new Cipher3DES("012345678901234567890123", "01234567");
String segredo = "Frase que não deve ser lida";
String escondido = c.encryptText(segredo);
String original = c.decryptText(escondido);

Considerações sobre a solução

  • Enquanto o .NET é bastante flexível quanto aos tamanhos da chave e do vetor de inicialização, o JAVA é bastante restritivo, de acordo com o padrão de chaves de 168 bits e ivs de 8 bytes.

  • Por questões de compatibilidade, os exemplo utilizam sempre UTF8 e os resultados das criptografias são representados em base64. Note que a base64 é suportada por padrão no .NET, enquanto em JAVA nós utilizamos a classe Base64Coder.

  • As implementações do algoritmo de criptografia utilizadas foram javax.crypto.Cipher do JAVA e System.Security.Cryptography do .NET.



Fontes:
http://en.wikipedia.org/wiki/Triple_DES
http://blog.bluesam.com/2009/07/triple-des-encryption-implementation.html
http://tripoverit.blogspot.com/2009/06/tripledes-encryption-compatibility.html
http://www.source-code.biz/base64coder/java/

quarta-feira, 11 de agosto de 2010

Por que criamos este blog


Bem, estamos trabalhando há vários anos com desenvolvimento de aplicações Web em nosso Instituto na Universidade Federal do Ceará, e depois deste tempo todo passamos por diversos problemas relacionados às plataformas tecnológicas que adotamos. Graças a ideia de um colega nosso, Rafael Costa, resolvemos criar este espaço virtual para podermos trocar com a comunidade em geral algumas soluções que criamos ou que encontramos em nossas navegações pela Web. Estamos querendo, portanto, dar um primeiro passo no processo de construção coletiva de conhecimento, uma das principais características da Web2.0. Espero que todos possam contribuir conosco, criticando e sugerindo novas soluções que possam ser úteis no processo de criação de aplicações para Web.

Que a Força esteja com todos!