Criptografia e Segurança: Hashing e AES com C# Prático

Criptografia é o seu escudo digital! Seja para proteger senhas, dados sensíveis🗝️ Azure Key Vault: Gerencie Segredos como um Especialista!🗝️ Azure Key Vault: Gerencie Segredos como um Especialista!Aprenda a proteger e gerenciar segredos, chaves e certificados com o Azure Key Vault em aplicações .NET, seguindo as melhores práticas de segurança na nuvem. em trânsito ou informações confidenciais, entender hashes e AES é essencial. Vamos explorar esses conceitos com exemplos práticos em C#, focando em solução de problemas reais como armazenamento seguro de senhas e criptografia de dados sensíveis🗝️ Azure Key Vault: Gerencie Segredos como um Especialista!🗝️ Azure Key Vault: Gerencie Segredos como um Especialista!Aprenda a proteger e gerenciar segredos, chaves e certificados com o Azure Key Vault em aplicações .NET, seguindo as melhores práticas de segurança na nuvem..

Tabela de Conteúdo🔗

1. O que é Criptografia?

2. 🔑 Hashes: A Impressão Digital dos Dados

3. Por que Hashear Senhas e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Não Criptografá-las?

4. Salt e Pepper: Ipzinhos Essenciais para Segurança🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real.

5. Implementando Hashing⚙️ Feature Engineering: Transforme Dados em Insights!⚙️ Feature Engineering: Transforme Dados em Insights!Descubra como o feature engineering no ML.NET revoluciona modelos. Aprenda normalização, encoding e criação de features para resultados surpreendentes! em C#

6. 🛡️ AES: Criptografia de Ponta a Ponta

7. Fluxo de Criptografia e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Descriptografia com AES

8. Exemplo Prático📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável. com AES em C#

9. 🚨 O que Nunca Fazer (Armadilhas Comuns🔏 Criptografia Assimétrica: Domine RSA e Troca de Chaves!🔏 Criptografia Assimétrica: Domine RSA e Troca de Chaves!Descubra como a criptografia assimétrica protege a troca de chaves e garante segurança em sistemas digitais usando RSA, C# e práticas recomendadas.)

10. Boas Práticas🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados. e Recomendações Finais

O que é Criptografia?🔗

A criptografia lida com processos que “embaralham” informações para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! que apenas pessoas ou sistemas autorizados consigam interpretá-las. Existem dois grandes objetivos:

  • Confidencialidade: Manter dados longe de olhos curiosos.
  • Integridade: Garantir que dados não sejam alterados sem que isso seja detectado.

Diferentes técnicas de criptografia são usadas dependendo do cenário:

🔑 Hashes: A Impressão Digital dos Dados🔗

Hash é uma função unidirecional que transforma dados em uma string📝 Strings em C#: Manipule Textos como um Mestre dos Caracteres!📝 Strings em C#: Manipule Textos como um Mestre dos Caracteres!Aprenda a dominar os segredos das strings em C# com técnicas de manipulação, concatenação, interpolação e boas práticas, impulsionando sua performance. única de tamanho fixo. Ideal para:

  • Armazenar senhas
  • Verificar integridade de arquivos
  • Assinaturas digitais

O hashing⚙️ Feature Engineering: Transforme Dados em Insights!⚙️ Feature Engineering: Transforme Dados em Insights!Descubra como o feature engineering no ML.NET revoluciona modelos. Aprenda normalização, encoding e criação de features para resultados surpreendentes! é como criar uma “impressão digital” de qualquer pedaço de informação. Você usa uma função🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. que pega seu dado de entrada (por exemplo, uma senha) e gera uma sequência de bytes aparentemente aleatórios, de tamanho fixo. Essa sequência se chama hash.

Exemplo do mundo real: se você recebe o pacote de café da loja online e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. quer saber se não foi violado, você confere o “selo de autenticidade” (hash). Se o selo (hash) confere com o esperado, ótimo - caso contrário, alguém adulterou o pacote.

Exemplo: Hash de Senha com Salt

using System.Security.Cryptography;
// Gerar hash com salt
public string HashSenha(string senha)
{
    byte[] salt = new byte[16];
    using (var rng = RandomNumberGenerator.Create())
    {
        rng.GetBytes(salt);
    }
    var pbkdf2 = new Rfc2898DeriveBytes(senha, salt, 10000, HashAlgorithmName.SHA256);
    byte[] hash = pbkdf2.GetBytes(32);
    // Armazene salt + hash
    return Convert.ToBase64String(salt) + "|" + Convert.ToBase64String(hash);
}
// Verificar senha
public bool VerificarSenha(string senhaDigitada, string hashArmazenado)
{
    string[] partes = hashArmazenado.Split('|');
    byte[] salt = Convert.FromBase64String(partes[0]);
    byte[] hashOriginal = Convert.FromBase64String(partes[1]);
    var pbkdf2 = new Rfc2898DeriveBytes(senhaDigitada, salt, 10000, HashAlgorithmName.SHA256);
    byte[] novoHash = pbkdf2.GetBytes(32);
    return novoHash.SequenceEqual(hashOriginal);
}

Por que usar salt? Evita ataques de rainbow table ao adicionar📦 List<T>: Dinamismo além dos Arrays!📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. aleatoriedade única para cada hash.

Por que Hashear Senhas e Não Criptografá-las?🔗

Para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! senhas, em geral não queremos conseguir recuperar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. o valor original. Queremos apenas validar se a senha digitada combina com a armazenada. Então o hashing é perfeito:

1. O usuário cadastra a senha.

2. O sistema faz o hash + salt.

3. Quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. o usuário tenta logar, o sistema faz o hash na senha digitada e compara com o que já está gravado.

Se fosse criptografia reversível, alguém com acesso às chaves (ou ao próprio sistema) poderia descriptografar e ver todas as senhas em texto puro. Um pesadelo de segurança🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real.!

Salt e Pepper: Ipzinhos Essenciais para Segurança🔗

A ideia é que, se seu banco de dados for🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! comprometido, o atacante não poderá simplesmente comparar o hash de senhas conhecidas, pois cada senha tem um salt único + pepper adicional.

Implementando Hashing em C#🔗

A forma mais comum é usar algoritmos como SHA256 ou SHA512. Também podemos utilizar funções🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. específicas para senhas, como PBKDF2, que faz várias iterações de hashing⚙️ Feature Engineering: Transforme Dados em Insights!⚙️ Feature Engineering: Transforme Dados em Insights!Descubra como o feature engineering no ML.NET revoluciona modelos. Aprenda normalização, encoding e criação de features para resultados surpreendentes!. Aqui vai um exemplo simples com SHA256 (não substitui métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. avançados de hashing, mas ilustra a ideia):

using System;
using System.Security.Cryptography;
using System.Text;
public static class HashHelper
{
    public static string GerarHashSHA256(string input)
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            byte[] bytesEntrada = Encoding.UTF8.GetBytes(input);
            byte[] bytesHash = sha256.ComputeHash(bytesEntrada);
            // Converter para string hex
            StringBuilder builder = new StringBuilder();
            foreach (var b in bytesHash)
            {
                builder.Append(b.ToString("x2"));
            }
            return builder.ToString();
        }
    }
}
// Uso:
string senha = "minhaSenhaSuperSecreta";
string hashGerado = HashHelper.GerarHashSHA256(senha);
Console.WriteLine($"Hash: {hashGerado}");

Esse método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. gera uma sequência hex de 64 caracteres (pois cada byte vira dois caracteres em hex), representando os 256 bits do hash.

🛡️ AES: Criptografia de Ponta a Ponta🔗

AES (Advanced Encryption Standard) é um algoritmo simétrico para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! criptografar/descriptografar dados. Usado em:

Diferentemente do hashing⚙️ Feature Engineering: Transforme Dados em Insights!⚙️ Feature Engineering: Transforme Dados em Insights!Descubra como o feature engineering no ML.NET revoluciona modelos. Aprenda normalização, encoding e criação de features para resultados surpreendentes!, a criptografia simétrica (como AES) é ideal quando precisamos recuperar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. o dado original mais tarde. Um exemplo comum é armazenar informações de cartão de crédito - você precisa “desembaralhar” os dados em algum momento para processar o pagamento.

Exemplo: Criptografar String

using System.Security.Cryptography;
public (string cipherText, string iv) Criptografar(string texto, byte[] chave)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = chave;
        aes.GenerateIV(); // IV único para cada operação
        ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter sw = new StreamWriter(cs))
                {
                    sw.Write(texto);
                }
            }
            return (Convert.ToBase64String(ms.ToArray()), Convert.ToBase64String(aes.IV));
        }
    }
}
public string Descriptografar(string cipherText, byte[] chave, string iv)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = chave;
        aes.IV = Convert.FromBase64String(iv);
        ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
        using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(cipherText)))
        {
            using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader sr = new StreamReader(cs))
                {
                    return sr.ReadToEnd();
                }
            }
        }
    }
}

Regras de Ouro do AES:

1. Nunca reutilize o IV

2. Use chaves🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. de 256 bits

3. Armazene chaves🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. em Azure Key Vault🗝️ Azure Key Vault: Gerencie Segredos como um Especialista!🗝️ Azure Key Vault: Gerencie Segredos como um Especialista!Aprenda a proteger e gerenciar segredos, chaves e certificados com o Azure Key Vault em aplicações .NET, seguindo as melhores práticas de segurança na nuvem. ou variáveis🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. de ambiente

Fluxo de Criptografia e Descriptografia com AES🔗

1. Gerar/obter📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. chave🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. e IV (seguras e únicas).

2. Criptografar os dados usando a chave🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. e IV.

3. Armazenar/transportar o dado📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. cifrado.

4. Descriptografar usando a mesma chave🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. e IV.

🚨 O que Nunca Fazer (Armadilhas Comuns)🔗

Erro GraveConsequênciaSolução
Usar MD5/SHA1 para hashVulnerável a colisõesMigrar para SHA-256 ou SHA-3
Criptografia ECBPadrões visíveis nos dadosUsar CBC ou GCM
Chaves hard-codedExposição total do sistemaUsar Azure Key Vault
Sem salt em hashesVulnerável a rainbow tablesGerar salt único por operação
// ⚠️ Exemplo Perigoso (NÃO FAÇA ISSO)
string hashInseguro = Convert.ToBase64String(
    SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(senha)));

Dica Profissional: Para sistemas legados .NET Framework, atualize para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! System.Security.Cryptography.AesGcm no .NET 8+ para melhor performance🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!Descubra como o StringBuilder otimiza a concatenação em C#, evitando desperdício de memória e melhorando a performance das aplicações. Veja exemplos práticos! e segurança.

Boas Práticas e Recomendações Finais🔗

Resumindo, criptografia é essencial para proteger dados🔒 Encapsulamento: Proteja Seus Dados como um Banco Suíço!🔒 Encapsulamento: Proteja Seus Dados como um Banco Suíço!Aprenda a proteger seus dados com encapsulamento em C#: técnicas e melhores práticas para um código seguro, modular e eficiente. confidenciais. Hashing suporta a segurança de senhas ao tornar a recuperação impossível, enquanto AES garante sigilo quando você precisa abrir o conteúdo novamente. Cuidar dos detalhes, como salt, pepper, chave e IV, faz toda a diferença para manter a sua aplicação e seus usuários protegidos.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados