Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Roger Tas

md5

Recommended Posts

Bom, procurei e nunca vi ninguém perguntando sobre o que vou perguntar (probaly because is too stupid)

 

Se:

 

$teste = 'hadouken';
$teste = md5($teste);
echo $teste;

Resultado será: 7e0638ea90936043d7a54fc3b83d8fa1 em qualquer lugar do mundo certo?

 

Agora temos:

 

$teste = 'hadouken';
$teste = md5($teste . 'alguma coisa aleatória como uma variável com nome do usuário ou algum outro dado dele?');
echo $teste;

Então eu pergunto:

Seria mais seguro de alguma forma ou se estou apenas exagerando já que um dia se a segurança for quebrada, esse valor random não vai dificultar em nada mais pro invasor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Roger Tas, hash MD5 é um algorítimo de 128 bits.

 

Como um hash, você não pode voltá-lo ao valor inicial, ou seja, MD5 da letra a (minúscula) será sempre 0cc175b9c0f1b6a831c399e269772661 e você não conseguirá, nunca, através do hash, recuperar a letra a novamente.

 

Quando se fala em quebrar um hash, estamos falando em encontrar uma colisão, ou seja, encontrar um valor arbitrário que gere o mesmo hash.

 

A probabilidade de se conseguir uma colisão com MD5 é de 1 em 2^128, ou seja, é necessário um esforço tremendo para tal façanha.

 

O ponto, no aspecto segurança, é que hoje já dispomos de máquinas capazes de, através de computação distribuída, encontrar uma colisão em um hash MD5 em um tempo financeiramente viável.

 

Quanto maior a tecnologia, maior a velocidade das máquinas e, consequentemente, menor o tempo gasto para encontrar a colisão e assim, maior a probabilidade de se encontrar uma colisão em um hash de 128bits.

 

Então, respondendo diretamente sua pergunta:

 

Um valor aleatório, concatenado à string principal, não fará seu sistema mais seguro.

 

A segurança está diretamente relacionada à dificuldade de se encontrar uma colisão, dessa forma, procure utilizar um hash Sha-1 de 160 bits (também já se conseguiu encontrar uma colisão no SHA-1) ou Sha-256, Sha-384 ou até Sha-512, dando preferência aos de 256 bits ou superior.

 

Caso, por curiosidade, queira ver como funciona o cálculo de um hash, veja essa implementação do Sha-1 http://forum.imasters.com.br/public/style_emoticons/default/seta.gif SHA-1, Secure Hash Algorithm

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma dúvida curiosa, quem define a quantidade de bytes de saída do HASH (MD5 - 32, SHA1 - 40, BASE64 - 64, etc)?

 

A saída do hash é chamada de message digest, ou seja, a representação hexadecimal do conteúdo, vejamos:

 

A letra a (minúscula) é definida pelo decimal 97.

 

O decimal 97 em binário http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 1100001 e em hexadecimal http://forum.imasters.com.br/public/style_emoticons/default/seta.gif 0x61

 

O problema é que, ao terminar o cálculo, teremos vários caracteres não trafegáveis e, para resolver esse problema, todos os caracteres do resultado são convertidos para seus respectivos hexadecimais (usando 2 bytes).

 

Então, se estamos usando 2 bytes para cada caractere para formar o message digest, basta que dividamos esse bytes por 2 e o resultado multipliquemos 8 para saber quantos bits resultarão:

 

<?php
$digest = md5( 'teste' );

var_dump( strlen( $digest ) * 4 ); //int(128)

 

O mesmo ocorre para o Sha-1 (de 160 bits):

 

<?php
var_dump( strlen( sha1( 'teste' ) ) * 4 ); //int(160)

 

Ou Sha-256 (256 bits):

 

<?php
var_dump( strlen( hash( 'sha256' , 'teste' ) ) * 4 ); //int(256)

 

Ou Sha-512 (512 bits):

 

<?php
var_dump( strlen( hash( 'sha512' , 'teste' ) ) * 4 ); //int(512)

 

BASE64 - 64, etc)?

 

Base 64 não é hash.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, na verdade eu não me referia apenas aos hashes e sim às técnicas de criptografia em geral. Erro meu e curiosidade sanada. =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

técnicas de criptografia em geral.

 

Cada algorítimo é baseado em um cálculo matemático, esse cálculo é documentado, especificado e regulamentado:

 

MD5 http://forum.imasters.com.br/public/style_emoticons/default/seta.gif http://www.kleinschmidt.com/edi/md5.htm

FIPS 180-1 (Secure Hash) http://forum.imasters.com.br/public/style_emoticons/default/seta.gif http://www.itl.nist.gov/fipspubs/fip180-1.htm

 

Ilustração da implementação do Sha1 em PHP http://forum.imasters.com.br/public/style_emoticons/default/seta.gif http://forum.imasters.com.br/index.php?/topic/357265-sha-1-secure-hash-algorithm/

Compartilhar este post


Link para o post
Compartilhar em outros sites

@João Batista Neto

Muito obrigado pelas informações detalhadas. Você disse que devo dar preferencia para as de 256 bits ou superior certo? Isso implica na perfomance de um sistema de login com cadastros?

 

Roger

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso implica na perfomance de um sistema de login com cadastros?

 

Depende, hehhehe

 

Se você for utilizar uma implementação como a que eu fiz do Sha-1 para ilustrar, então o desempenho será muito comprometido, isso porque a minha implementação foi feita 100% em PHP enquanto as nativas são feitas em C, o que as torna muito mais rápidas.

 

Veja só uma ilustração comparativa:

 

Imagem Postada

 

Imagem Postada

O código usado:

<?php
function calcMD5( array $hashes ){
for ( $i = 0 ; $i < 10000 ; ++$i ){
	$hashes[] = md5( 'neto' . $i );
}

return $hashes;
}

function calcSha1( array $hashes ){
for ( $i = 0 ; $i < 10000 ; ++$i ){
	$hashes[] = sha1( 'neto' . $i );
}

return $hashes;
}

function calcSha256( array $hashes ){
for ( $i = 0 ; $i < 10000 ; ++$i ){
	$hashes[] = hash( 'sha256' , 'neto' . $i );
}

return $hashes;
}

function calcSha384( array $hashes ){
for ( $i = 0 ; $i < 10000 ; ++$i ){
	$hashes[] = hash( 'sha384' , 'neto' . $i );
}

return $hashes;
}

function calcSha512( array $hashes ){
for ( $i = 0 ; $i < 10000 ; ++$i ){
	$hashes[] = hash( 'sha512' , 'neto' . $i );
}

printf( "Fim Sha-512\n" );

return $hashes;
}

calcMD5( array() );
calcSha1( array() );
calcSha256( array() );
calcSha384( array() );
calcSha512( array() );

 

Como pode ver, a diferença de tempo de execução entre o MD5 e o Sha-512 é de apenas 0.01399 segundos, mesmo executando-os 10.000 vezes, o tempo no pior caso é de apenas uma fração de segundos.

 

Então, pode utilizar qualquer um dos hashes de 256 bits+ que você só terá a ganhar.

 

;)

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também pode ser utilizado o mesmo sistema que o fórum IPB utiliza, o esquema de segurança é via MD5 concatenado com uma outra palavra que é vinda do banco de dados, formando também um hash MD5 do MD5 anterior.

 

isset($_POST) ? extract($_POST) : false;

(isset($pass))    ? $con->ant_sql($pass) : false;

$verif=$con->query("SELECT * FROM ibf_members WHERE members_l_username='$usuario'");

if(mysql_num_rows($verif) > 0){
        $dado = $con->dados($verif,1);
        $senha_hash = $dado['members_pass_salt'];
        }

if(md5(md5($senha_hash) . md5($pass)) != mysql_result($verif,0,'members_pass_hash')){

...

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

formando também um hash MD5 do MD5 anterior.

Como eu disse anteriormente, você jamais conseguirá voltar um hash, independentemente de ter utilizado apenas 1 ou N hash de hash.

 

Sendo assim, mesmo você tendo utilizado um encadeamento de 10000 MD5, não melhorará a segurança da sua aplicação já que, matematicamente falando, a chance de se encontrar uma colisão continuará sendo de 1 em 2^128 para o MD5, mesmo com o encadeamento de hash de hash concatenando com valores aleatórios.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, este é o sistema do IPB.

 

Porém eu também não o utilizo, pois como o João disse não adianta muita coisa, meu objetivo foi mostrar para um bom esclarecimento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isso ai galera, ótimo tópico.

Só uma consideração, quando vamos fazer sistemas que utilizam MD5 para gerar os hashes ainda vale fazer o salt. Como o João mesmo disse não é para aumentar a segurança em relação a força-bruta e sim de pesquisa na web.

Por exemplo, se você digitar o hash de palavaras muito conhecidas em buscadores, rapidinho você terá uma resposta da palavra original.

Façam o teste, digite: e10adc3949ba59abbe56e057f20f883e no google

e logo você terá a string "123456" exibida como resultado.

Então ainda vale o usar o salt para tentar livrar dessas strings faceis.

 

Exemplo do salt: MD5. "kliJygb%{:content:}quot;

 

ai fica dificil achar o hash da palavra mais este salt maluco hehe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 em 2^128

2^128 = 3.40282367 × 10^38

parece um número grande...

mesmo com um salt cabeludo, pra evitar os dicionários de dados, ainda continua sendo jeito vasado de guardar suas senhas??

teoricamente pra descubri teria que invadir o banco (ou ficar anos decodificando...), mas ja que ja vai estar invadido vai fazer diferença um MD5 ou um SHA??

:huh:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Curiosidade: Qual o hash menos suscetível a colisões possível em PHP?

 

Ao que parece, quanto mais bots melhor. Mas até que ponto podemos ir?

Compartilhar este post


Link para o post
Compartilhar em outros sites

João,

o que você recomenda a nível de novos projetos,ou seja, quando criarmos um sistema qual hash usar? independente do tamanho do sistema.

Existe algum problema de usar essa função "hash"? ou seja , pode acontecer casos em que em algum servidor ela esteja desabilitada? pelo li que li no manual do php não tem esse problem né.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Qual o hash menos suscetível a colisões possível em PHP?

 

Atualmente o Sha-512

 

E alguém já implementou uma boa solução SHA-512 em PHP?

 

Com boa, quero dizer, dentre tudo, "rápida" (relativamente falando).

Compartilhar este post


Link para o post
Compartilhar em outros sites

E alguém já implementou uma boa solução SHA-512 em PHP?

 

Alguém não leu o tópico todo... <_<

 

<?php
$message = 'O Bruno não leu o tópico todo...';
echo hash( 'sha512' , $message );

 

Saída:

a9308b6798c91ca14093b23f74a8e022ee0f2bd389084aeedff922abddddf0e437ab7fe393d2b54ee51d3763c770224f01e02f94eaff7ddd382f9bc1e5d6b7c8

;)

 

EDIT:

 

o que você recomenda a nível de novos projetos,ou seja, quando criarmos um sistema qual hash usar?

 

Tudo depende da necessidade do projeto.

 

Segunda a Wikipédia:

Segurança é a percepção de se estar protegido de riscos, perigos ou perdas.

 

No caso de uma aplicação, segurança está diretamente relacionada a informação que a aplicação armazena.

 

Agora veja, se os dados de sua aplicação não forem tão valiosos, então MD5 é o suficiente já que, o custo para encontrar uma colisão, mesmo no MD5 é relativamente alto, maior que o ganho que o invasor terá com a informação.

 

Agora, imagine que você esteja trabalhando com informações altamente valiosas, como dados bancários de usuários, nesses casos, o ganho obtido com a informação pode ser muito maior que o custo de se encontrar a colisão em um MD5.

 

Uma aplicação segura, então, é a relação entre ganho com o conteúdo obtido em relação ao custo para se obter tal conteúdo, se o ganho for maior que o custo então sua aplicação é insegura.

 

Existe algum problema de usar essa função "hash"? ou seja , pode acontecer casos em que em algum servidor ela esteja desabilitada?

 

Não conheço nenhum caso onde a função hash() tenha sido desabilitada por algum administrador de servidor.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

João Batista Neto, caso eu for usar um SHA512 qual tamanho de caracteres eu tenho que deixar no meu banco de dados para que ele armazene o código gerado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.