Ir para conteúdo

POWERED BY:

Arquivado

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

Micilini Roll

comando salt php

Recommended Posts

Pessoal e o seguinte eu tenho um sistema de cadastro e de login,pois bem atualmente ele pega o login do usuario e a senha qje o usuario escolhei e insere no banco de dados normalmente:

 

LOGIN-micilini

SENHA-abcdf

 

E no login ele pegas tudo que o rapaz escreveu como a senha e o login e pesquisa no banco de dados atraves do pdo e se a senha e o login conferir ele entra,e cria uma session login! Somente cria 1 sessions!

Um amigo meu me falou que isso e meio inseguro e que devo usar comando salt:

 

$password = "banana"; $salt = "aB1cD2eF3G"; $password = md5($salt.$password);

 

Entao no caso do exemplo acima toda vez que eu criar uma session a session devera conter o salt,outra duvida minha e a senha que vai pro banco de dados na hora do cadastro,esta devera conter o comando salt+md5,e consequentemente no sistema de login devera ter o mesmo comando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salt não é um comando. É uma string aleatória utilizada para dificultar o uso de raibow tables.

 

Ele está correto, deixa o sistema mais seguro.

 

Entao no caso do exemplo acima toda vez que eu criar uma session a session devera conter o salt,outra duvida minha e a senha que vai pro banco de dados na hora do cadastro,esta devera conter o comando salt+md5,e consequentemente no sistema de login devera ter o mesmo comando?

Sim, todo o lugar que você for utilizar a senha e criptografá-la, deverá ter o mesmo salt, uma vez definido um salt, ele nunca mais poderá ser mudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obg amigo grande ajuda acabou com a minha duvida!,mas entao e muito dificl descobiri este salt correto,entao pra ser descoberto o usuario tera que ter acesso aos meus projetos .php,é dificl ele ter acesso aos meus arquivos e se tiver ? Qual a camada de protecao uso para isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, ele descobrirá somente com acesso ao seus arquivos. Nesse caso, coloque-o em um arquivo de configurações. A camada de proteção é o próprio servidor que não deve permitir o download do código PHP, somente do código processado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu pensei em criptografia mais acho que somente isso nao e o bastante,no caso que vc me disse devo colocaf o arquivo em configuracoes no momento eu ultilizo o cpanel 2.0 ,tem algum tutorial na net aonde eu possa encontrar o que vc me disse?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é nas configurações do cpanel, é um arquivo de configurações do seu site/sistema. No código PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opaaaa... calma lá...

O uso de um salt só para TODAS as senhas não resolve o problema.

 

Imagine um cenário em que um hacker tenha acesso ao seu banco de dados. Vasculhando lá, ele vê algumas senhas iguais e aí pode inferir que o seu salt é único. Sabendo disso, fica mais fácil para ele conseguir obter alguns dados usando pesquisas baseadas em histórico.

 

O correto é que cada senha tenha um salt próprio. Normalmente, usa-se algo que seja único para gerar o salt e se armazena isso junto com os dados.

 

Se você capturar o microtime de registro do usuário e salvar isso na tabela, pode usar alguma função sobre esse microtime para gerar um salt.

 

$salt = microtime();
$saltedPassword = md5(sha1($salt) . $password);

Agora você armazena ambas as variáveis na tabela. Na hora de recuperar os dados, você só precisa fazer o mesmo procedimento:

 

SELECT * FROM users WHERE password = MD5(CONCAT(SHA1(salt), {$password}));

Compartilhar este post


Link para o post
Compartilhar em outros sites

é nisso mesmo que eu estava pensando em fazer,tive o mesmo pensamento que o seu so que no caso eu iria tentar fazer de outra forma: Se a senha for igual ao salt 1 ENTRA senao verifica o salt2......

 

muito obrigado mesmo pela a sua ajuda amigo! vou ate salvar aqui nas minhas apostilas de php

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Opaaaa... calma lá...

O uso de um salt só para TODAS as senhas não resolve o problema.

Na verdade, quando falamos de segurança, nada resolve o problema. Vejo segurança como um conjunto de camadas. Você adiciona camadas de segurança. No caso, ele separou o salt das hashes no DB.

 

Caso alguém consiga o acesso às hashes, precisaria conseguir, depois, acesso ao sistema de arquivos para descobrir o salt utilizado.

 

A sua solução troca uma camada de segurança por outra. Se eu tiver acesso aos hashes, não preciso mais invadir o sistema de arquivos para descobrir o salt. Mas, com salt randômico, preciso gerar uma rainbow table para cada salt.

 

Uma forma legal de trabalhar com hashes + salt's randômicos é utilizar a biblioteca bCrypt.

 

Dessa forma, podemos incluir mais uma camada de segurança que é o custo do hash. Ou seja, quantas vezes o algoritmo do hash vai ser executado.

 

$_POST['senha'] = 'senha';

// Salvar no banco
$senha = crypt($_POST['senha'], sprintf('$5$rounds=100$%s, microtime()));

// $senha = $5$rounds=1000$0.79780000 13584$X9EkfI3bm4LMNDDOBLtRzQL95ZHIZKoMnR.DVqSsqHA

É o valor de [inline]$senha[/inline] que vai ser guardado no banco

 

Passando o próprio hash como segundo parâmetro, a biblioteca já faz tudo sozinha:

  • descobre o algoritmo utilizado
  • descobre quantas vezes o algoritmo foi executado
  • descobre o salt recebido
  • Em posse dessas informações, basta verificar se a senha recebida gera o mesmo hash:

 

if (crypt($_POST['senha_do_login'], $senha_guardada_no_db) === $senha_guardada_no_db) {
 // senha está correta

Compartilhar este post


Link para o post
Compartilhar em outros sites

se alguém conseguir entrar na base de dados, não fará difrença alguma o tipo de técnica para codificar as senhas..

 

exemplo

 usuario,     senha,               email
  superadmin, 345FDGDe5¨$fr8345jD, fulano@foo.bar

eu sou um invasor, entro na base para fuçar a conta de um usuario específico ou qualquer outra conta para obter acesso ao painel administrativo do sistema.

 

nesse caso encontrei a tabela de usuarios administrativos, então como logar com essa conta?

 

simples, troco o email


usuario, senha,              email   superadmin, 345FDGDe5¨$fr8345jD, hacker@foo.bar

salvo a mudança e vou no painel de login onde terá o campo "recuperar a senha"

 

coloco o email que inseri "hacker@foo.bar", vou gerar uma nova senha e pronto.. já era..

 

volto na base de dados e retorno o email que estava lá originalmente.
se souber onde grava logs, modifico os logs também, para reduzir vestígios.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim hinom ,mas se fosse o meu site vc nao iria conseguir pois eu ja tinha pensado nisso tambem,pq os nomes das tabelas do banco de dados sao errantes(confusos) e os registros tambem,entao vc tera que ter acesso aonde estao os meus arquivos para depois abri-los

 

E assim comecar uma descriptografia unica!

 

a técnica de "nomes errantes" ajuda a dificultar, mas isso é de menos... se o sujeito estiver mesmo obstinado consegue fácil.. pode ter 500 tabelas na base de dados que ainda assim consultará uma a uma para encontrar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

:seta: http://php.net/manual/en/faq.passwords.php

:seta: http://phpsec.org/articles/2005/password-hashing.html

 

Atenção especial à nova API de Password Hashing do PHP 5.5, que já faz o trabalho de salt da forma correta:

 

:seta: http://php.net/manual/pt_BR/ref.password.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

se alguém conseguir entrar na base de dados, não fará difrença alguma o tipo de técnica para codificar as senhas..

 

exemplo

 usuario,     senha,               email
  superadmin, 345FDGDe5¨$fr8345jD, fulano@foo.bar
eu sou um invasor, entro na base para fuçar a conta de um usuario específico ou qualquer outra conta para obter acesso ao painel administrativo do sistema.

 

nesse caso encontrei a tabela de usuarios administrativos, então como logar com essa conta?

 

simples, troco o email

usuario, senha,              email   superadmin, 345FDGDe5¨$fr8345jD, hacker@foo.bar
salvo a mudança e vou no painel de login onde terá o campo "recuperar a senha"

 

coloco o email que inseri "hacker@foo.bar", vou gerar uma nova senha e pronto.. já era..

 

volto na base de dados e retorno o email que estava lá originalmente.

se souber onde grava logs, modifico os logs também, para reduzir vestígios.

 

 

Hinom, "entrar" no DB não implica, necessariamente em alterar os dados lá.

 

Sinceramente, se eu tivesse a possibilidade de alterar os emails, eu procuraria descobrir o método de criptografia utilizado e colocaria minha senha também, sem a necessidade de pedir email de troca de senha.

 

Acho que falávamos de hash tables vazadas como foi o caso recente do LinkedIn.

 

Edit

 

@João Batista Neto, isso aqui http://php.net/manual/pt_BR/function.password-verify.php é um shortcut pra isso aqui:

 

crypt('password', $hash) === $hash

Certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@João Batista Neto, isso aqui http://php.net/manual/pt_BR/function.password-verify.php é um shortcut pra isso aqui:

 

 

 

crypt('password', $hash) === $hash

Certo?

 

 

 

 

Não, vai um pouco além disso.

 

 

 

Em 3:40:42, o Erick Tedeschi falou especificamente sobre a nova API.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exato, agora, veja que, além da comparação, ainda é feita a iteração do hash:

/* We're using this method instead of == in order to provide
 * resistence towards timing attacks. This is a constant time
 * equality check that will always check every byte of both
 * values. */
for (i = 0; i < hash_len; i++) {
    status |= (ret[i] ^ hash[i]);
}

Esse é o ponto. Como o Erick disse, o hash_len é uma medida de custo computacional. Ela pode ser configurada através da função password_verify e é usada para iterar X vezes o hash, tornando-o mais forte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exato, agora, veja que, além da comparação, ainda é feita a iteração do hash:

 

Esse é o ponto. Como o Erick disse, o hash_len é uma medida de custo computacional. Ela pode ser configurada através da função password_verify e é usada para iterar X vezes o hash, tornando-o mais forte.

E também pode ser configurada na crypt

 

http://forum.imasters.com.br/topic/485017-duvida-comando-salt-php/#entry1926571

Uma forma legal de trabalhar com hashes + salt's randômicos é utilizar a biblioteca bCrypt.

 

Dessa forma, podemos incluir mais uma camada de segurança que é o custo do hash. Ou seja, quantas vezes o algoritmo do hash vai ser executado.

http://php.net/crypt

...

  • CRYPT_BLOWFISH - Blowfish hashing with a salt as follows: "$2a$", "$2x$" or "$2y$", a two digit cost parameter, "$", and 22 digits ...
  • CRYPT_SHA256 - SHA-256 hash with a sixteen character salt prefixed with $5$. If the salt string starts with 'rounds=<N>$', the numeric value of N is used to indicate how many times the hashing loop should be executed, much like the cost parameter on Blowfish. [...]
  • CRYPT_SHA512 - SHA-512 hash with a sixteen character salt prefixed with $6$. If the salt string starts with 'rounds=<N>$', the numeric value of N is used to indicate how many times the hashing loop should be executed, much like the cost parameter on Blowfish. [...]

 

 

E, a propósito, o que eu entendi do comentário e implementação é que eles fazem a checagem do hash obtido e o hash alvo byte-a-byte ao invés de comparar a igualdade geral dos dois lados

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok pessoal entendi perfeitamente...ate que uns chegaram e implementaram mais coisas que eu acabei ficando perdido vamos lá por partes..este comando salt devera ser inserido toda vez que um usuario se:

 

a)Cadastrar

b)Fazer login

 

certo? se sim vamos prosseguir,o codigo do salt sera tanto na tela de cadastro quanto na de login desta forma:

 

$_POST['senha'] = 'senha';

// Salvar no banco
$senha = crypt($_POST['senha'], sprintf('$5$rounds=100$%s, microtime()));

 

 

certo?



pessoal testei aqui agora e infelismente nao adiantou o metodo

 

// Salvar no banco
$senha = crypt($_POST['senha'], sprintf('$5$rounds=100$%s, microtime()));

 

 

 

esta inserindo perfeitamente no banco so que na hora do login:

 

$senha = crypt(strtolower(anti_injection($_POST['senha'])));
// restante do codigo como select from bla bla bla
$obj=$stmt->fetchAll(PDO::FETCH_ASSOC);
 foreach($obj as $v){
	$senha_db = $v['xxxxxx']; 
 }

 if($senha_db == $senha){ 

//redireciona

 

 

mais infelismente nao esta sendo redirecionado

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.