Criptografando a Senha em C# – Classe Criptografia


public class Criptografia
    {
        /// <summary>     
        /// Vetor de bytes utilizados para a criptografia (Chave Externa)     
        /// </summary>     
        private static byte[] bIV = 
        { 0x50, 0x08, 0xF1, 0xDD, 0xDE, 0x3C, 0xF2, 0x18,
        0x44, 0x74, 0x19, 0x2C, 0x53, 0x49, 0xAB, 0xBC };

        /// <summary>     
        /// Representação de valor em base 64 (Chave Interna)    
        /// O Valor representa a transformação para base64 de     
        /// um conjunto de 32 caracteres (8 * 32 = 256bits)    
        /// A chave é: "Criptografias com Rijndael / AES"     
        /// </summary>     
        private const string cryptoKey = "Q3JpcHRvZ3JhZmlhcyBjb20gUmluamRhZWwgLyBBRVM=";

        /// <summary>     
        /// Metodo de criptografia de valor     
        /// </summary>     
        /// <param name="text">valor a ser criptografado</param>     
        /// <returns>valor criptografado</returns>
        public static string Encrypt(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 = new UTF8Encoding().GetBytes(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 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);
            }
        }

        /// <summary>     
        /// Pega um valor previamente criptografado e retorna o valor inicial 
        /// </summary>     
        /// <param name="text">texto criptografado</param>     
        /// <returns>valor descriptografado</returns>     
        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);
            }
        }
    }

Esse post foi publicado em Dicas C#.Net e marcado , , , , . Guardar link permanente.

10 respostas para Criptografando a Senha em C# – Classe Criptografia

  1. Bruno Souza disse:

    Como eu altero o valor de bIV na minha classe de forma que no meu código não fique igual ao seu?
    Como eu altero o valor da cryptoKey, de forma a gerar a minha própria chave criptografada?

    • wendellrs disse:

      Ola Bruno !!!

      Bem a chave de código em byte esta gerada por padrão, nesse caso trabalha externamente ao programa para gerar uma chave com a cryptoKey, nesse caso só altere a cryptoKey com um conjunto de caracteres correspondentes que você desejar, isso já é o suficiente para alterar a chave criptografada, alterando assim sua criptografia.

      🙂

      Wendell Santos

  2. Igor disse:

    Olá amigo, está faltando a classe Rijndael, não está não?

  3. Vinicius disse:

    Perfeito, funcionando perfeitamente!

  4. Jhonatan disse:

    O problema é quando a classe tem que ser instanciada de alguma outra classe, se criptografada e descriptografada na mesma instanciação funciona perfeitamente. Porém se for utilizada em vários projetos, lendo criptografada e descriptografando para utiliza-la ela não te traz 100%.

  5. Vinicius disse:

    Boa tarde, funcionou direitinho, só não consegui guardar a senha criptografada no banco de dados firebird, na minha tabela o campo que guarda a senha é varchar, será que é o tipo do campo que esta errado? return Convert.ToBase64String(mStream.ToArray()); como se pode ver o return devolve base64, alguma ideia?

    • wendellrs disse:

      Ola Vinicius, td bem ?? Então na verdade você vai utilizar o método Encrypt e Decrypt, ambos recebem o parametro String e tem o retorno de String (String (retorna o texto encriptado) Encrypt(String recebe o texto a ser encriptado) , String (retorna o texto encriptado, desencriptado) Decrypt(recebe o texto encriptado), na verdade se voce trabalahr com esses 2 metodos de encriptar e desencriptar ele sozinho faz todo o trabalho na questão de armazenar no banco de dados, dependendo do campo que você esta trabalhando (varchar ou Nvarchar ou Text) esse campo deve ser grande o suficiente para guardar o texto encriptado, sugiro que coloque não menos de 300 de tamanho nesse campo de texto ou mais depende do que você deseja persistir no banco…

  6. Juliano disse:

    Muito Bom!.. Parabéns!

Deixe um comentário