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

Criptografia é o seu escudo digital! Seja para proteger senhas, dados sensíveisBoas Práticas de Segurança no Docker SwarmBoas Práticas de Segurança no Docker SwarmDescubra como assegurar seu Docker Swarm com práticas de segurança que protegem a comunicação, gerenciamento de secrets e integridade de imagens. 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íveisBoas Práticas de Segurança no Docker SwarmBoas Práticas de Segurança no Docker SwarmDescubra como assegurar seu Docker Swarm com práticas de segurança que protegem a comunicação, gerenciamento de secrets e integridade de imagens..

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 dadosConceitos fundamentais de NoSQL: bases para trabalhar com MongoDB em C#Conceitos fundamentais de NoSQL: bases para trabalhar com MongoDB em C#Descubra os fundamentos do NoSQL e aprenda como utilizar MongoDB com C# para desenvolver aplicações .NET escaláveis e modernas até 2025. for 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 de ambienteConfigurando variáveis de ambiente e strings de conexão para MongoDB em produçãoConfigurando variáveis de ambiente e strings de conexão para MongoDB em produçãoAprenda a configurar variáveis de ambiente e construir strings de conexão seguras para MongoDB em produção com práticas recomendadas para C#.

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 legadosPerformance Tuning de Consultas LINQ em Sistemas LegadosPerformance Tuning de Consultas LINQ em Sistemas LegadosDescubra como otimizar consultas LINQ em sistemas legados com técnicas práticas que melhoram a performance sem grandes reescritas. .NET Framework, atualize para 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