Início > Programação, Segurança > Criptografia de Senha em Java

Criptografia de Senha em Java

Uma senha armazenada em sua forma original pode ser visualizada por qualquer pessoa ou aplicação que tenha acesso ao banco de dados. As senhas também podem ser interceptadas com fishing. Uma boa prática de segurança é armazenar o hash da senha e não a senha original. Esse processo pode ser unidirecional ou bidirecional, mas quando é unidirecional é mais forte, pois para validar a senha informada pelo usuário, é necessário calcular o seu hash com o mesmo algoritimo criptográfico para só então comparar com a versão armazenada. Vamos mostrar um exemplo em Java, mas antes precisamos fazer uma breve explicação sobre o funcionamento da função de hash.

Função de Hash

Criptografia é um conjunto de princípios e técnicas utilizadas para codificar uma mensagem e torná-la ininteligível para os que não tenham acesso às convenções utilizadas na codificação.

Criptografia

Figura 1 – A ciência da criptografia

Uma função de dispersão criptográfica ou função hash criptográfica é uma função considerada praticamente impossível de inverter, isto é, de recriar o valor de entrada utilizando somente o valor de dispersão. Os dados de entrada são chamados de mensagem e o valor de dispersão é chamado de mensagem resumida ou simplesmente resumo.

hash

Figura 2 – Hashing

Uma função de dispersão criptográfica deve possuir as seguintes propriedades:

  • Resistência à pré-imagem: Dado um valor hash deve ser difícil encontrar qualquer mensagem m tal que h = hash(m). Este conceito está relacionado ao da função de mão única (ou função unidirecional). Funções que não possuem essa propriedade estão vulneráveis a ataques de pré-imagem.
  • Resistência à segunda pré-imagem: Dada uma entrada m1 deve ser difícil encontrar outra entrada m2 tal que hash(m1) = hash(m2). Funções que não possuem essa propriedade estão vulneráveis a ataques de segunda pré-imagem.
  • Resistência à colisão: Deve ser difícil encontrar duas mensagens diferentes m1 e m2 tal que hash(m1) = hash(m2). Tal par é chamado de colisão hash criptográfica. Essa propriedade também é conhecida como forte resistência à colisão. Ela requer um valor hash com pelo menos o dobro do comprimento necessário para resistência à pré-imagem.

Funções hash criptográficas possuem várias aplicações em segurança da informação como por exemplo os certificados digitais. Elas também podem ser utilizadas para indexar dados em tabelas, para detectar dados duplicados, identificar arquivos únicos e como checksum para detectar dados corrompidos.

Uma função de hash gera uma cadeia de caracteres de tamanho fixo a partir de uma sequência de qualquer tamanho. É uma equação matemática que a partir de um texto cria um código chamado message digest (resumo de mensagem). O resumo criptográfico é o resultado retornado por uma função de hash. Este pode ser comparado a uma impressão digital, pois cada documento possui um valor único de resumo e até mesmo uma pequena alteração no documento, como a inserção de um espaço em branco, resulta em um resumo completamente diferente.

É quase impossível achar duas mensagem que resultam no mesmo hash. Se mudar apenas um bit da mensagem original, o valor de hash muda completamente. Em criptografia, “dificuldade” geralmente significa “quase certamente longe do alcance de qualquer adversário que deve ser impedido de quebrar o sistema enquanto a segurança de tal sistema for importante”. O esforço que o agente malicioso deve colocar na tarefa é normalmente proporcional ao que ele espera conseguir. Entretanto, como o esforço necessário geralmente cresce rapidamente com o comprimento do resumo, até um atacante com um grande poder de processamento pode ser neutralizado adicionando algumas dúzias de bits ao resumo.

SHA-2 é um conjunto de funções hash criptográficas projetadas pela NSA (Agência de Segurança Nacional dos EUA). SHA significa secure hash algorithm (algoritmo de hash seguro). Dentre os variantes do SHA-2, a mais utilizada é o SHA-256. Em Java, SHA-256 função hash de 256 bits que fornece 128 bits de segurança contra ataques de colisão.

AppnimiSHA256DecrypterIcon256

Figura 3 – SHA-2

As aplicações que usam hashes criptográficos para armazenar senhas só são minimamente afetadas por um ataque de colisão. Se o algoritmo de hash for fraco, pode-se fazer um ataque de pré-imagem. Nesse caso, pode-se também tentar um ataque de força bruta à partir da inversão da encriptação das senhas.

Exemplo em Java

O código abaixo utiliza o algorítmo SHA-256 para codificar um array de bytes em um array de tamanho fixo (16 bytes). Cada byte desse array é convertido para uma versão hexadecimal:

   public String digest(String password) throws NoSuchAlgorithmException, 
         UnsupportedEncodingException {
      MessageDigest algoritmo = MessageDigest.getInstance("SHA-256");
      byte digestMessage[] = algoritmo.digest(password.getBytes("UTF-8"));
      StringBuilder hexPassword = new StringBuilder();
      for (byte aByte : digestMessage) {
         hexPassword.append(String.format("%02X", 0xFF & aByte));
      }
      return hexPassword.toString();
   }

O valor retornado pode ser armazenado em banco de dados. Para aumentar a dificuldade de êxito do atacante, poderíamos concatenar um valor aleatório (sal) à String original antes da conversão.

Referências

1. [http://www.devmedia.com.br/como-funciona-a-criptografia-hash-em-java/31139]
2. [http://blog.caelum.com.br/guardando-senhas-criptografadas-em-java/]
3. [http://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html]
4. [https://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_hash_criptogr%C3%A1fica]
5. [https://pt.wikipedia.org/wiki/SHA-2]
6. [http://slideplayer.com.br/slide/397484/]

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: