none
Método bem simples para Criptografar Senhas RRS feed

  • 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);
    }


    domingo, 2 de dezembro de 2012 14:59

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-42932250d40c

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    segunda-feira, 3 de dezembro de 2012 00:44
  • 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




    terça-feira, 4 de dezembro de 2012 15:20
    Moderador