Inquiridor
Método bem simples para Criptografar Senhas

Discussão Geral
-
Senhores, após pesquisar achei esse método que funciona perfeitamente:
public static string Encrypt(string fernanda) { try { // Se a string não está vazia, executa a criptografia if (!string.IsNullOrEmpty(fernanda)) { // Cria instancias de vetores de bytes com as chaves byte[] bKey = Convert.FromBase64String(cryptoKey); byte[] bText = new UTF8Encoding().GetBytes(fernanda); // Instancia a classe de criptografia Rijndael Rijndael rijndael = new RijndaelManaged(); // Define o tamanho da chave "256 = 8 * 32" // Lembre-se: chaves possíves: // 128 (16 caracteres), 192 (24 caracteres) e 256 (32 caracteres) rijndael.KeySize = 256; // Cria o espaço de memória para guardar o valor criptografado: MemoryStream mStream = new MemoryStream(); // Instancia o encriptador CryptoStream encryptor = new CryptoStream( mStream, rijndael.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write); // Faz a escrita dos dados criptografados no espaço de memória encryptor.Write(bText, 0, bText.Length); // Despeja toda a memória. encryptor.FlushFinalBlock(); // Pega o vetor de bytes da memória e gera a string criptografada return Convert.ToBase64String(mStream.ToArray()); } else { // Se a string for vazia retorna nulo return null; } } catch (Exception ex) { // Se algum erro ocorrer, dispara a exceção throw new ApplicationException("Erro ao criptografar", ex); } } //usar: private void button1_Click(object sender, EventArgs e) { string teste; teste = Encrypt(textBox1.Text); textBox2.Text = teste; } //Descriptografar: public static string Decrypt(string text) { try { // Se a string não está vazia, executa a criptografia if (!string.IsNullOrEmpty(text)) { // Cria instancias de vetores de bytes com as chaves byte[] bKey = Convert.FromBase64String(cryptoKey); byte[] bText = Convert.FromBase64String(text); // Instancia a classe de criptografia Rijndael Rijndael rijndael = new RijndaelManaged(); // Define o tamanho da chave "256 = 8 * 32" // Lembre-se: chaves possíves: // 128 (16 caracteres), 192 (24 caracteres) e 256 (32 caracteres) rijndael.KeySize = 256; // Cria o espaço de memória para guardar o valor DEScriptografado: MemoryStream mStream = new MemoryStream(); // Instancia o Decriptador CryptoStream decryptor = new CryptoStream( mStream, rijndael.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write); // Faz a escrita dos dados criptografados no espaço de memória decryptor.Write(bText, 0, bText.Length); // Despeja toda a memória. decryptor.FlushFinalBlock(); // Instancia a classe de codificação para que a string venha de forma correta UTF8Encoding utf8 = new UTF8Encoding(); // Com o vetor de bytes da memória, gera a string descritografada em UTF8 return utf8.GetString(mStream.ToArray()); } else { // Se a string for vazia retorna nulo return null; } } catch (Exception ex) { // Se algum erro ocorrer, dispara a exceção throw new ApplicationException("Erro ao descriptografar", ex); } } //usando: private void button2_Click(object sender, EventArgs e) { string teste; teste = Decrypt(textBox2.Text); MessageBox.Show(teste); }
- Editado William John Adam TrindadeModerator terça-feira, 4 de dezembro de 2012 15:50 formatar codigo
- Tipo Alterado William John Adam TrindadeModerator terça-feira, 4 de dezembro de 2012 16:03 é uma discussao
Todas as Respostas
-
Que ótimo Vinicius,
Procure divulgar neste thread que o William criou para duvidas frequentes em C#:
http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/70d22b8d-3e2a-4a04-8abc-42932250d40cVitor Mendes | Seu feedback é muito importante para todos!
Visite o meu site: http://www.vitormendes.com.br/ -
Vinicius,
Parabens pela iniciativa, mas (pessoalmente) sou contra o uso de qualquer tipo de criptografia para senhas. Se algo é criptografado, pode ter certeza que ele pode ser descriptografado tambem..
Eu prefiro criar um Hash para senha e guarda-lo. No momento da validaçao bastaria recriar o hash da senha digitada e comparar com o hash arquivado,
Fica mais ou menos assim:
Para gerar o hash (antes de arquiva-lo)
string password = GetPasswordFromUserInput(); // specify that we want to randomly generate a 20-byte salt using (var deriveBytes = new Rfc2898DeriveBytes(password, 20)) { byte[] salt = deriveBytes.Salt; byte[] key = deriveBytes.GetBytes(20); // derive a 20-byte key // save salt and key to database }
No momento da comparaçao:
string password = GetPasswordFromUserInput(); byte[] salt, key; // load salt and key from database using (var deriveBytes = new Rfc2898DeriveBytes(password, salt)) { byte[] newKey = deriveBytes.GetBytes(20); // derive a 20-byte key if (!newKey.SequenceEqual(key)) throw new InvalidOperationException("Password is invalid!"); }
fonte: http://stackoverflow.com/questions/4329909/hashing-passwords-with-md5-or-sha-256-c-sharp
Um hash nao pode ser descriptografado (ele nao contem a informaçao original).
Para se descobrir qual string gerou um hash, praticamente vc tem que testar combinaçao por combinhaçao..
Por exemplo, a String "A" vai gerar
Salt: gbytqT4nM/Y1/e5Ttuu/tblN6lY=
Key El6vIM3jbaQvYpWVIyToBf5+mXI=Mas exitem bilhoes (multiplique isso pelo numero de atomos de hidrogenio no universo conhecido) de outras strings que geram a mesma combinaçao Salt/Key
Ok... lendo isso vc pode até pensar que é mais facil descobrir a senha por este metodo, bastaria ir testando strings até uma gerar a mesma combinaçao.... Sim, mas para isso vc tem que conhecer o metodo usado para cria o hash, qual foi o tamanho da chave, quantas iteraçoes foram utilizadas, etc... Se o hacker souber isso, ele parte para a segunda etapa (força bruta) , testando cada uma das senhas possiveis, gerando um hash e comparando com o hash gerado. Tempo para conseguir descobrir uma senha forte (maiuscula, minusculas, numeros,caracteres especiais e um tamanho de senha maior que 8) : alguns milenios.
Como eu disse antes, um hash nao leva consigo a informaçao original. Nao é possivel "desHashar" uma string, entao de nada adianta tentar analiza-lo para descobrir um indicio da senha.
Isso é muito bom para senhas, mas péssimo pra documentos. Entao o metodo acima serve para quando desejamos uma assinatura de um dado, como por exemplo, assegurar que um campo texto (exemplo um laudo medico) nao foi alterado por uma ferramenta externa (tipo um editor Access). qualquer alteraçao no laudo gerara um hash diferente o que vai caracterizar alteraçao indevida.
Bom.. é isso.
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée
- Editado William John Adam TrindadeModerator terça-feira, 4 de dezembro de 2012 19:24