Armazenamento de senhas no Linux

Você sabe como são armazenadas as senhas no Linux? O que é e para que serve o salt number? O que é MD5? Este artigo não pretende ir muito a fundo no mundo da criptografia, mas sim explicar os conceitos necessários para entender o arquivo de senhas, os reais ataques. Quem programa para a WEB poderá achar este artigo além de curioso, muito útil!

[ Hits: 246.017 ]

Por: Elgio Schlemer em 08/02/2008 | Blog: http://gravatai.ulbra.tche.br/~elgio


Algoritmos de HASH



Muita confusão se faz quanto aos algoritmos de HASH. Muitos acham que ele é um algoritmo de criptografia. Não é. Pertence a ciência da criptografia, alguns são até baseados em algoritmos de criptografia, mas o que quero deixar claro é que Algoritmos de HASH não servem para cifrar.

HASH são também conhecidos como "algoritmos de mão única". Qualquer coisa que se "cifra" com eles é impossível matematicamente de se recuperar. Além disso eles possuem outras características:

a) não possuem chave. Gerar o hash não envolve nenhum segredo que deva ser compartilhado.

b) tamanho único. Não importa o quão grande é a informação original, o hash será sempre de um mesmo tamanho. Como exemplo o famoso e depreciado MD5. Ele tem 128 bits de tamanho, mesmo que seja o HASH de uma única letra (8bits) ou de um arquivo de 1GB!

c) infinitos hashes para uma mesma mensagem. Isto é meio confuso de entender e pode até parecer uma fraqueza. Novamente o caso do MD5: como ele possui sempre 128 bits, o número de hashes MD5 existentes no Universo é grande, mas limitado e conhecido. É 2128. Contudo o número de mensagens é infinito. Não tem hashes únicos para cada diferente mensagem no Universo. Logo, tem mensagens que possuem o mesmo HASH. Se o HASH da frase "Eu sou Viva o Linux" tiver como HASH FE:45:56, existem outras infinitas mensagens que gerem o mesmo hash FE:45:56. Isto vale para qualquer algoritmo de hash e não significa uma fraqueza, apenas uma conclusão matemática. Descobrir duas ou mais mensagens que geram o mesmo hash é chamado de colisão, coisa que o pessoal de Banco de Dados estuda (porque se usa hash como método de pesquisa em BD).

Para tornar mais fácil entender o que é um algoritmo de HASH eu costumo apresentar em sala de aula o "HASH by Elgio". Um HASH podre, fraco, mas fácil de entender.

Meu algoritmo de HASH consiste em simplesmente somar os bytes de uma frase, com teto de 255 (255 +2 = 257 = 2). Matematicamente pode-se expressar como o Modulo 256 da soma de todos os bytes. Depois de somar todos os caracteres o byte final é considerado o hash.

Na frase "Viva o Linux" tem-se os seguintes bytes:

'V' 'i' 'v' 'a' ' ' 'o' ' ' 'L' 'i' 'n' 'u' 'x'
086 105 118 097 032 111 032 076 105 110 117 120
Soma dos bytes = 1109
1109 mod 256 = 85

Neste caso o Hash de "Viva o Linux" através do algoritmo "by Elgio" seria 85. Veja que pelo meu método não importa o tamanho da frase, o HASH será sempre um número entre 0 e 255. Isto serve para explicar a propriedade que eu citei de que o hash é sempre do mesmo tamanho.

Mas a grande pergunta é para que serve isto (não este meu algoritmo que só serve para fins didáticos).

Se eu previamente conheço o HASH (85) e alguém me apresenta a frase "Grande Linux" dizendo que ela é do hash armazenado, ao verificar eu percebo que a frase fornecida possui o HASH 129. Como não é 85, esta frase não é deste hash.

A grande sacada do arquivo de senhas do Linux é armazenar apenas o HASH. Se minha senha fosse "Viva o Linux" o arquivo de senhas teria apenas 85. Se eu digitar corretamente a senha o SO deverá calcular os mesmos 85 o que indica que acertei a senha. Assim o sistema não precisa armazenar a senha, mas somente o HASH.

Não se apressem em falar mal deste meu HASH by Elgio! Ele é ruim mesmo e é bom que seja para meus fins didáticos.

O problema é que com este meu algoritmo de HASH ridículo é muito fácil alguém, até com papel e lápis, chegar aos mesmos 85 sem saber a frase. De cara eu percebo que apenas a letra 'U' já resolve meu problema pois ela é justamente 85. Apresentei este algoritmos by Elgio para explicar o que é HASH, mas não como exemplo de um que possa ser usado. Ele não resiste ao mais simples ataque: o da força bruta.

Um algoritmo de HASH sério precisa fazer exatamente isto, reduzir cadeias de bytes para uma sequência menor de tamanho reduzido, mas sem que alguém tenha meios de quebrar.

O MD5 é bom nisto. Como seus 128 bits, um ataque de força bruta poderia levar até 2128 possibilidades (um cara muito azarado).

Considerando que não existem caras tão azarados de acertar justamente na última tentativa, trabalhar com a metade é uma boa medida.

Qual a metade de 2128?

NÃO NÃO!!
Não é 264

A metade de 2128 é 2127!

Isto ainda dá 170141183460469231731687303715884105728 possibilidades! (Você consegue ler este número? )

Vamos a uma simulação: se eu tiver 5.000.000 de computadores, cada um deles com 100.000 processadores de 100Ghz que consiga a façanha de realizar uma tentativa por ciclo de clock (100G tentativas por segundo), o tempo estimado para quebrar seria:

170141183460469231731687303715884105728 / 100.000.000.000 / 100.000 / 5.000.000

Dividi por 100 bilhões porque é quantas tentativas um processador completa por segundo (100Ghz), dividi por 100.000 porque cada computador tem cem mil processadores e dividi novamente por 5.000.000 porque tenho cinco milhões de computadores iguais a este.

Ainda assim isto resulta em 3.402.823.669.209.384 segundos ou 107.902.830 anos! Bem vindo a força da matemática da força bruta. Novamente, aos já iniciados em criptografia, estou falando de força bruta sendo que bem sabemos que existem atalhos em alguns métodos.

Resumindo: existem algoritmos de HASH que são impossíveis de se quebrar por força bruta. MD5 ainda é um exemplo deles (as vulnerabilidades descobertas no MD5 tem ver com colisões não com força bruta).

Tais algoritmos podem ser usados para nosso propósito e de fato o são!

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Senha em um simples arquivo texto
   3. Senha em um arquivo criptografado
   4. Algoritmos de HASH
   5. Armazenando senhas com segurança
   6. Ataques ao Sistema de HASH
   7. Uso de salt number
   8. Como o Linux armazena
   9. Conclusões e referências
Outros artigos deste autor

Parâmetros interessantes do scanf e do printf em C

Cuidado com números em Ponto Flutuante

Guerra Infinita, uma análise da Ciência da Computação

Mecanismo de firewall e seus conceitos

Programação com números inteiros gigantes

Leitura recomendada

Engenharia Social - Fios de telefone

Os Vírus e o Linux

Linux - Permissões de acesso especiais

ClamAV em desktop

Arquivo de configuração do mod_security

  
Comentários
[1] Comentário enviado por leandrorocker em 08/02/2008 - 10:26h

Legal o artigo, meu TCC quando me formei em ciência da computação foi um estudo sobre hashes, fiz um programa pra quebrá-los (md5,sha1,sha224,sha256,sha384 e sha512) e apresentei os resultados é uma área interessantíssima e como sempre tem o dedo do Ronald Rivest no meio, o cara é um gênio.

[2] Comentário enviado por tenchi em 08/02/2008 - 11:17h

Cara, simplesmente demais. Imagino quantos milhares de computadores deve ter um destes esteriótipos de hackers de filmes americanos que conseguem quebrar a criptografia de qualquer servidor do governo... hauahua
São artigos assim que fazem do VOL o site que é.

[3] Comentário enviado por everton3x em 08/02/2008 - 11:36h

Excelente o seu artigo.
Realmente, o maior problema no caso de senhas é o BIOS (Bicho Idiota Operando o Sistema).

[4] Comentário enviado por kabalido em 08/02/2008 - 11:42h

Cara,
Sem palavras! O artigo foi mais que sensacional.
Li seu artigo e gostei muito mesmo.
Esse tipo de artigo é aquele que dá prazer de ler.
Parabéns e "Viva o Linux".

[5] Comentário enviado por kalib em 08/02/2008 - 17:06h

Parece até brincadeira mas ainda é bastante comum encontrar sites diversos que armazenam suas szenhas em arquivos, bancos de dados ou mesmo no próprio código da página toscamente implantados em java script por exemplo...Infelizmente ainda é comum encontrar este tipo de ingenuidade na internet...

Excelente o seu artigo Elgio, digno de destaque aqui no vol bem como suas demais contribuições.

obrigado pela colaboração.

[6] Comentário enviado por borgetha em 08/02/2008 - 19:35h

No FreeBSD, antigamente (anos 90 - não sei se ainda é assim), o sistema liberava login e senha, caso o usuário errasse a senha, o sistema esperava 1 segundo e liberava o login novamente. Então se o usuário errasse novamente a senha, o sistema esperava 2 segundos para liberar de novo o login, e a cada erro o tempo dobrava. Era uma forma interessante de se evitar ataques de força bruta, pois o tempo de espera começa a ficar looooongo rapidamente. Claro que só funciona para quem não está logado e nem conhece o hash.

[7] Comentário enviado por f_Candido em 08/02/2008 - 23:58h

Muito Bom. É um campo realmente interessante.
Parabéns.
Abraços

[8] Comentário enviado por removido em 09/02/2008 - 09:44h

Muito bom o artigo. Geralmente não leio um artigo todo, somente as partes mais interessantes (é uma forma de adquirir apenas as partes importantes e poupar tempo!), mas esse li todo e com prazer. Digno de figurar entre os melhores artigos destas revistas famosas que falam de informática.

... e ainda existe quem coloque a senha 0123456789!

huahuahua

Parabéns

[9] Comentário enviado por sombriks em 09/02/2008 - 15:22h

belo artigo, nota 10!

[10] Comentário enviado por arlindom.correa em 10/02/2008 - 04:48h

Um artigo bem interessante e claro. Parabéns Elgio.

[11] Comentário enviado por grodriguesq em 10/02/2008 - 18:25h

Excelente artigo.. adorei a parte.. em q o usuário coloca asenha embaixo do teclado...

Acho q vou até enviar isso por email para alguns usuários da minha rede...
Ou seria mais fácil... tacar os usuarios da minha rede pela janela... ..

[12] Comentário enviado por bitencourt em 10/02/2008 - 18:39h

Muito legal o artigo, parabéns!

[13] Comentário enviado por dailson em 11/02/2008 - 14:53h

Artigo de ótimo nível aqui no VOL.
Parabéns Elgio

[14] Comentário enviado por asterix-super em 29/09/2008 - 18:30h

Elgio

De repente, passei a gostar do assunto criptografia, depois de ler seu artigo, muito obrigado.

Pergunto: O hash é mais eficaz do que aquela criptografia que é feita inserindo informação dentro de imagens (esteganografia)?

[15] Comentário enviado por elgio em 12/05/2009 - 12:42h

Outros artigos que escrevi sobre criptografia:
http://www.vivaolinux.com.br/artigo/Introducao-a-criptografia
http://www.vivaolinux.com.br/artigo/Criptografia-chave-simetrica-de-bloco-e-de-fluxo

[16] Comentário enviado por removido em 19/05/2009 - 18:04h

Artigo excelente, bem claro para um assunto muitas vezes complicado.

Um paper interessante de cientistas chineses mostra exemplos de colisão em funções de hash MD4, MD5, HAVAL-128 e RIPEMD: http://eprint.iacr.org/2004/199.pdf

Parabéns!!!


[17] Comentário enviado por samuel.abeu em 01/06/2009 - 00:23h

Assunto me esclareceu muito, me despertou a curiosidade e dissernimento ao escolher uma senha.
agradeço.

[18] Comentário enviado por _d4rks1d3_ em 07/06/2009 - 22:49h

Um excelente artigo!!
nao sabia destas coisas nao, valeu pelo artigo, ajudo muito a entender como funciona o armazenamento das senhas no linux!!

Parabéns!!

[19] Comentário enviado por XimenesWambach em 09/06/2009 - 16:22h

Gostei muito do artigo, achei muito explicativo.
parabêns

[20] Comentário enviado por Lisandro em 07/07/2009 - 12:32h

Excelente!

[21] Comentário enviado por Daemonio em 22/07/2009 - 10:11h

Excelente!! Você já tem o meu apoio caso você queira fazer a parte II deste artigo.

[22] Comentário enviado por mdenison em 30/07/2009 - 20:46h

Muito bom o seu artigo. Dê continuidade ao tema.

[23] Comentário enviado por guidobert em 02/08/2009 - 18:42h

Parabens ....... go on .....

[24] Comentário enviado por hmacedo em 24/11/2011 - 10:52h

Elgio, o seu "Hash by Elgio" é utilizado no cálculo de checksum das mensagens trocadas através do protocolo FIX. Praticamente todas as bolsas de valores mundiais utilizam esta técnica. Já não é tão ruim assim hehehehe

[25] Comentário enviado por kabelovga em 19/05/2014 - 12:32h

Show demais !!! Valeu pelo artigo !!!

[26] Comentário enviado por brunotisatto em 25/09/2014 - 09:00h

Boa Prof!!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts