Prof. Sandro Wambier
Hash: garantia de integridade dos dados Um hash é uma sequência de bits geradas por um algoritmo de dispersão, em geral representada em base hexadecimal, que permite a visualização em letras e números (0 a 9 e A a F). Ex.: MD5("The quick brown fox jumps over the lazy dog") = 9e107d9d372bb6826bd81d3542a419d6 O conceito teórico diz que "hash é a transformação de uma grande quantidade de informações em uma pequena quantidade de informações".
Ao baixar uma imagem ISO, como o DVD de instalação de uma distribuição Linux, por exemplo, o mesmo tipo de conferência pode ser feita. Antes de gravar a mídia e iniciar a instalação, convém sempre conferir se o hash (ou checksum) atribuído à imagem original é o mesmo da cópia presente no disco rígido da sua máquina.
Imagine a seguinte situação: Determinado arquivo está sendo compartilhado por torrent. Porém, uma das pessoas modifica o seu conteúdo e continua distribuindo-o pela rede. Dessa forma, quem fizesse o download desse conteúdo acabaria, no fim, com um arquivo adulterado, podendo estar corrompido ou, até mesmo, escondendo algum tipo de malware.
Para garantir a integridade dos dados compartilhados, os clientes de torrent usam um truque muito esperto: ao gerar o arquivo original, o software calcula uma sequência única de letras e números e a atribui aos arquivos ou pastas que começarão a ser compartilhados. Se a sequência estiver diferente, significa que o arquivo foi alterado e que não deve ser baixado. **O resumo calculado pela Função de Hash é único para cada mensagem. Qualquer alteração na mensagem irá gerar um hash diferente.
Essa sequência é conhecida como Hash info e pode ser facilmente verificada em indexadores como o The Pirate Bay:
MD5: O MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., muito utilizado por softwares com protocolo P2P, verificação de integridade e logins. SHA-1 (Secure Hash Algorithm): Desenvolvido pelo NIST e NSA. SHA-1 foi considerado o sucessor do MD5. WHIRLPOOL: função criptográfica de hash desenvolvida por Paulo S. L. M. Barreto e por Vincent Rijmen (co-autor do AES). A função foi recomendada pelo projeto NESSIE (Europeu). Foi também adotado pelo ISO e IEC como parte do padrão internacional ISO 10118-3.
Graças ao hash, sistemas computacionais não precisam armazenar as senhas dos usuários cadastrados na máquina em texto puro, ou seja, de maneira legível. Caso contrário, bastaria abrir esse arquivo ou tabela de banco de dados para ter acesso às senhas de todo mundo. Por isso, para saber se o que você digitou no campo password está correto, o sistema calcula o hash da senha informada e decide se libera seu login ou não.
Exemplo típico em PHP (função HASH) <?php // Senha do usuário, pode ter vindo do $_POST, $_GET ou outro lugar. $senha = 'hello world'; // Gera o hash da senha usando SHA512. $senha = hash('sha512',$senha); // Resultado: // ca4e913424bfcfe71c016829a371a1f1 // Salvamos o hash da senha no banco.
Rainbow Tables Você pode usar o SHA512, Whirlpool e pensar que está seguro, mas existe uma coisa chamada Rainbow Tables, onde um cracker gera uma tabela com o hash gerado de todas as palavras de um dicionário, combinando palavras e até adicionando símbolos e dígitos à essas palavras. Com essa Rainbow Table fica fácil descobrir a senha original (hello world). Existem diversos sites com diversas Rainbow Tables disponíveis para download.
RainbowCrack (BruteForce)
A solução: Salt A solução mais simples é utilizar um salt que é uma string complexa que será concatenada a senha, ou ainda melhor: utilizar outro campo como ID, telefone, etc como salt dinâmico, evitando utilizar salt fixo. <?php $salt = '1%1cAu!g+>K53PY}'; // Senha do usuário, pode ter vindo do $_POST, $_GET ou outro lugar. $senha = 'hello world'; // Gera o hash da senha usando SHA-512. $senha = hash('sha512', $senha. $salt); // Resultado: // c1de0ebde1fd59955ccd57ccd89ac2e9 // Salvamos o hash da senha+salt no banco.
A utilização da assinatura ou firma digital providencia a prova inegável de que uma mensagem veio do emissor. Para verificar este requisito, uma assinatura digital deve ter as seguintes propriedades: Autenticidade - o receptor deve poder confirmar que a assinatura foi feita pelo emissor; Integridade - qualquer alteração da mensagem faz com que a assinatura não corresponda mais ao documento; Irretratabilidade (não repúdio) - o emissor não pode negar a autenticidade da mensagem.
Existem diversos métodos para assinar digitalmente documentos, e esses métodos estão em constante evolução. Porém de maneira resumida uma assinatura típica envolve dois processos criptográficos: o hash (resumo) e a encriptação deste hash.
Após gerar o hash, ele deve ser criptografado através de um sistema de chave pública, para garantir a autenticação e a irretratabilidade. O autor da mensagem deve usar sua chave privada para assinar a mensagem e armazenar o hash criptografado junto a mensagem original.
Para verificar a autenticidade do documento, deve ser gerado um novo hash a partir da mensagem que está armazenada, e este novo resumo deve ser comparado com a assinatura digital. Para isso, é necessário descriptografar a assinatura utilizando a chave pública obtendo o hash original. Se ele for igual ao hash recém gerado, a mensagem está íntegra.
Exercício avaliativo Form seguro 1) Desenvolva um form de cadastro de usuários em PHP (usuário, senha e telefone) que armazene a senha no banco em forma de hash+salt fixo (O telefone será usado como salt) utilizando a função hash(). Obs.: Verifique a instalação dos servidores Apache2, MySQL e módulo PHP5 se for rodar em sua máquina local Debian-based, lembrando o caminho dos arquivos hospedados do Apache2: /var/www. Para instalar: $ apt-get install $ apt-get install $ apt-get install $ apt-get install apache2 php5 mysql-server phpmyadmin