Ir para conteúdo

Arquivado

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

Micilini Roll

Criptografia em md5>sha1 para senhas?

Recommended Posts

Olá Pessoal seguinte antes de fazer um insert no banco de dados gostaria de saber se é possivel descriptografar esta senha:

 

$senha = "Sou_do_imasters_senha_8236149"
$senha_codificada = md5(sha1($senha));
echo $senha_codificada;

 

ate ai tudo bem! mas no meu sistema de login eu puxo a senha apartir do $_POST e verifico no banco de dados! mas como ouvi dizer que md5 é descriptografavel e sha1 eu acho que nao é! como ficaria meu $_POST??

 

$senha_do_formulario = $_POST['senha_formulario'];

$senha_do_formulario = ??????

 

como ficaria?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faria com um SALT estático criptografando um time(), Ex.: md5(time()) para um melhor controle da aplicação.

Em caso de urgência, uma simples troca de uma letra no SALT invalidaria todo o acesso para fins de correção etc.

 

//Config
define ('SALT', '37c87a8c5651fb11725i7c09f8151190');

//Formulario
$senha = "Sou_do_imasters_senha_8236149";
$senha_codificada = sha1( SALT . $senha );
echo $senha_codificada;

ai sim criptografava com qualquer função md5, sha1, sha512, etc...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Pessoal seguinte antes de fazer um insert no banco de dados gostaria de saber se é possivel descriptografar esta senha:

 

Na verdade os sites que dizem descriptografar um hash em md5, usão de uma técnica chamada Rainbow table que consiste basicamente de consultar em uma lista onde se tem varios hash md5 mais comuns com o seu respectivo valor antes de ser gerado hash, por isso a importancia do que WDuarte citou o uso de um salt dificultando assim que a senha seja encontrada em uma lista de hash's comuns.

Compartilhar este post


Link para o post
Compartilhar em outros sites

md5(sha1($senha)) = "tiro no pé";

Primeiramente, tanto MD5 quanto SHA-1 estão obsoletos. O processadores atuais podem gerar mais de 15 milhões de hashes SHA-1 ou MD5 por segundo, conseguem quebrar qualquer senha com menos de 8 caracteres em menos de 1 minuto. Hoje em dia, você precisa usar ao menos bcrypt. A biblioteca phpass é um excelente opção.

 

Em segundo lugar, usar MD5 para "re-hash" de um hash SHA-1 é, como diria o Enrico Pereira, um tiro no pé. Isso apenas aumentaria a possibilidade de colisão (quando mais de uma sequencia distinta de caracteres gera um mesmo hash), pois a saída de SHA-1 tem 160 bits, enquanto a de MD5 tem apenas 128 bits. E MD5 já tem problemas de colisão por si só! Se for usar um desses, que ao menos opte pelo SHA-1 (por ser um pouco mais forte) e apenas por ele.

 

 

E só mais uma coisinha, sem medo de parecer chato e pedante: tecnicamente, esses algorítimos (MD5, SHA, bcrypt, PBKDF, scrypt, etc), que alguns chamam de "criptografia de mão única", não são, na verdade, criptografias (encryption), mas sim funções de embaralhamento de senhas (password hashing function). Se algo está criptografado, se supõe que esse estado possa ser revertido facilmente, pelo uso de uma senha ou chave, o que não é o caso desses algorítimos supracitados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei da seguinte forma pessoal!

 

<?php
//config 
define('SALT', '37c87a8c5651fb11725i7c09f8151190');
//Formulario
$senha_login = "Sou_do_imasters_senha_8236149";
$senha = "Sou_do_imasters_senha_8236149";
$senha_codificada = sha1( SALT . $senha );
echo $senha_codificada;

if(sha1(SALT.$senha_login) == $senha_codificada){

echo "<br>  deu certo!!!!!!!!!!!";

}else{
echo "<br> Não deu certo";
}
?>

 

o problema a ser pensado agora é:

 

1-Como o hacker/cracker irá descobrir o salt e se esta criptografado em sha1?



pois que eu saiba a senha critografada o exemplo acima sempre alega :

 

 

1dce0b71bbe45e19a2817411821f825ea845fb75

 

enquanto o MD5 alega numeros diferentes em cada refresh na pagina(Bom pelo menos alegava em um site que gerava md5)



osb: a nao ser se o site gerava salts diferentes??



Dei uma olhada neste site e vi que ele diz sobre sha2

 

http://www.not-implemented.com/comparing-hash-algorithms-md5-sha1-sha2/

 

eu acho que vou para o sha383 ou 512...segurança em primeiro lugar mas se mesmo assim o cara invadir o banco de dados ja era tudo mesmo rrsrsrs



outra coisa! pessoal agora fiquei na duvida! uso o bcrypt ou o sha384??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está usando um SALT estático... parece que você não está entendendo bem qual o propósito do SALT.

 

Um SALT é uma sequencia aleatória de caracteres que devem ser acrescentados a sequencia de caracteres da senha para gerar um hash único mesmo quando a sequencia de caracteres da senha é a mesma, contando com o SALT seja sempre diferente.

 

O Ricardo Saraiva, acima, citou Rainbow Tables, um ataque em que uma lista de hashes é criada baseando-se em listas de sequencias possíveis até determinado número de caracteres e lista de senhas mais usadas e então comparada com a lista de senhas para saber quais batem. Se estas senhas estiverem sem SALT, com uma única lista de hashes o hacker poderá quebrar todas ou a maior parte delas em algumas horas, mas com SALT, ele terá de gerar uma lista para cada senha, o que torna o processo muito mais demorado ou até mesmo impraticável. Mas apenas se cada senha tiver um SALT único e criptograficamente seguro. Portanto, o SALT é basicamente um meio para derrotar Rainbow Tables.

 

Não tem problema algum armazenar o SALT na mesma tabela em que você está armazenando a sua senha. Para gerar um SALT com PHP você tem três opções, da mais simples a mais recomendável:

 

uniqid:

$salt = uniqid(mt_rand(), true)

/dev/random:

$salt = fopen ( '/dev/random', 'rb' );

openssl_random_pseudo_bytes (PHP>=5.3)

$salt = openssl_random_pseudo_bytes(18);

 

Mas recomendo mesmo que você use o phpass.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas recomendo mesmo que você use o phpass.

 

Não conhecia, vou dar uma olhada! :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

bcrypt é um algorítimo para embaralhar senhas, assim como MD5 e SHA-1. Mas ele é tido como um dos poucos seguros atualmente, junto com SHA-512, PBKDF2 e scrypt. A mais conhecida implementação de bcrypt para PHP é o phpass.

Então baixe logo lá no link que te passei (acima) e comece a usar!

 

 

Não conhecia, vou dar uma olhada! :thumbsup:

 

:clap:

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu vi o phpass e no programa test.php só peguei esta linha:

 

<?php
#
# This is a test program for the portable PHP password hashing framework.
#
# Written by Solar Designer and placed in the public domain.
# See PasswordHash.php for more information.
#

require 'PasswordHash.php';

header('Content-type: text/plain');

$ok = 0;

# Try to use stronger but system-specific hashes, with a possible fallback to
# the weaker portable hashes.
$t_hasher = new PasswordHash(8, FALSE);

$correct = 'test12345';
$hash = $t_hasher->HashPassword($correct);

print 'Hash: ' . $hash . "\n";

?>

 

ele me mostra o hash na tela!,isso ja é o suficiente para fazer a inserção no banco de dados correto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim. Não precisa se preocupar com o SALT, ele já está incluso no hash retornado. O phpass gera o SALT pra você e o embute na senha.

 

Você precisa usar apenas dois métodos da classe [inline]HashPassword[/inline] para gerar o hash (que será armazenado no banco de dados) e [inline]CheckPassword[/inline] para verificar se uma determinada senha digitada combina com o hash.

 

-

 

Sobre o construtor...

 

Esse número 8 que está como primeiro parâmetro do construtor representa o custo da senha. Quanto maior o número, maior será o tempo de processamento para gerar o hash e consequentemente, mais custoso será para o cracker. A força do bcrypt está justamente nisso. Enquanto, por exemplo, gerar todos os hashes de todas as combinação possíveis de uma sequencia de 10 caracteres custaria $1.100/ano com MD5, com bcrypt custará $39 bilhões/ano, mas com custo 11 (fonte: Colin Percival, criador do scrypt). Recomendo que você coloque custo de 12 ao invés de apenas 8. Mas mesmo do jeito que está já está muitas vezes mais forte que MD5.

 

Quanto ao segundo parâmetro do construtor, que está em FALSE. Serve para indicar se a senha gerada será portátil ou não (se funcionará em mais de um sistema). Por padrão o phpass gera senhas fortes baseadas no sistema onde ele está rodando (ele usa informações como versão do PHP, arquitetura de memória, SO, etc.), isso significa que se não for portátil, hashes gerados em um servidor não poderão ser usados em outro servidor. É uma segurança a mais. Mas para sites grandes que rodam em cluster, a portabilidade é necessária.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mangakah e outros que estao acompanhando estou com um problemao aqui com este phpass,seguinte antes dele ser apresentado o meu banco de dados funcionava da seguinte forma:

 

 

	$identificacao_a = strtolower(mysql_real_escape_string($_POST['identificacao']));
	$identificacao = preg_replace("/[^a-z]/i", "",$identificacao_a);
	
	$validar_identificacao = $ponte_db->prepare("SELECT identificacao FROM ol WHERE LOWER(identificacao) = :ccp");
    $validar_identificacao->bindValue(":ccp",$identificacao);
    $validar_identificacao->execute();
	$existe_id = $validar_identificacao->rowCount();
	
	if($existe_id > 0){
        echo '1'; // 1 para mostrar que ja existe um usuario com este nome
      }else{
        echo '2'; // 2 para mostrar que nao existe um usuario com este nome
      }

 

agora que existe esse phpass eu fiz o seguinte depois da variavel:

 

$identificacao = preg_replace("/[^a-z]/i", "",$identificacao_a);

 

eu adicionei o comando:

 

require ('ler_phpass.php'); 
	$ok = 0;
    $t_hasher = new PasswordHash(8, FALSE);
$hash = $t_hasher->HashPassword($identificacao);

agora ele converteu o conteudo da variavel identificacao para phpass e armazenou dentro da variavel $hash correto?

 

so que agora deu pane! como eu vou fazer pro comando:

 

$check = $t_hasher->CheckPassword($correct2, $hash);

 

verifique no select do banco de dadoS???



como esse comando acima vai fazer a integração com este aqui debaixo:

 

$validar_identificacao->bindValue(":ccp",$identificacao);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas essa [inline]identificacao[/inline] não é o nome de usuário? O phpass é para ser usado apenas para a senha.

 

Você deve selecionar o campo senha (hash) no banco de dados usando o nome de usuário fornecido via input (bom verificar antes se esse nome é válido e se existe no banco de dados) e então usar o método CheckPassword para comparar o campo hash com a senha fornecida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode me responder a pergunta anterior?

Mas essa [inline]identificacao[/inline] não é o nome de usuário?

 

Nessa tabela [inline]ol[/inline] você armazena um campo chamado [inline]identificacao[/inline] que é o nome de usuário, certo? E também tem outro que é a senha desse usuário que ele usará para fazer login no seus sistema, certo? Então, essa [inline]identificacao[/inline] não deve ser passada pelo phpass, apenas a senha. Entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

aaaaahh entendi! agora eu me toquei tem razão eu acho que o nome de usuario nao é necessario criptografar mesmo! somente a senha do usuario! vlw mesmo! estou quase dormindo aqui com meus olhos fechando rsrs resolvido +4 pra voce!

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.