php net hash




SHA1 vs md5 vs SHA256: qual usar para um login PHP? (7)

Eu estou fazendo um login php, e estou tentando decidir se devo usar SHA1 ou Md5, ou SHA256 que eu li em outro artigo sobre stackoverflow. Alguma delas é mais segura do que outras? Para SHA1 / 256, ainda uso sal?

Além disso, esta é uma maneira segura de armazenar a senha como um hash no mysql?

function createSalt()
{
    $string = md5(uniqid(rand(), true));
    return substr($string, 0, 3);
}

$salt = createSalt();

$hash = sha1($salt . $hash);

Aqui está a comparação entre o MD5 e o SHA1. Você pode ter uma ideia clara sobre qual é o melhor.


Como apontou Johannes Gorset, o post de Thomas Ptacek, da Matasano Security, explica por que funções de hashing simples e de uso geral, como MD5, SHA1, SHA256 e SHA512, são opções de hashing de senha insatisfatórias .

Por quê? Eles são muito rápidos - você pode calcular pelo menos 1.000.000 hashes MD5 por segundo por núcleo com um computador moderno, então a força bruta é viável contra a maioria das senhas que as pessoas usam. E isso é muito menos do que um cluster de servidor de cracking baseado em GPU!

Salgar sem esticar a chave significa apenas que você não pode pré-calcular a mesa do arco-íris, você precisa construí-la ad hoc para esse sal específico. Mas isso não vai tornar as coisas muito mais difíceis.

Usuário @Will diz:

Todo mundo está falando sobre isso, como eles podem ser hackeados pela internet. Como já foi dito, limitar as tentativas torna impossível quebrar uma senha pela Internet e não tem nada a ver com o hash.

Eles não precisam. Aparentemente, no caso do LinkedIn, eles usaram a vulnerabilidade comum de injeção de SQL para obter a tabela de banco de dados de login e quebraram milhões de senhas offline.

Então ele volta para o cenário de ataque off-line:

A segurança realmente entra em jogo quando todo o banco de dados é comprometido e um hacker pode executar 100 milhões de tentativas de senha por segundo em relação ao hash md5. O SHA512 é cerca de 10.000 vezes mais lento.

Não, o SHA512 não é 10000 vezes mais lento que o MD5 - leva apenas o dobro. Cripta / SHA512 , por outro lado, é uma besta muito diferente que, como sua contraparte do BCrypt, executa um alongamento de chave , produzindo um hash muito diferente com um sal aleatório integrado e levará algo entre 500 e 999999 vezes para computar (alongamento é sintonizável).

SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

Então a escolha para o PHP é Crypt / Blowfish (BCrypt), Crypt / SHA256 ou Crypt / SHA512. Ou pelo menos Crypt / MD5 (PHK). Veja www.php.net/manual/en/function.crypt.php


MD5 é ruim por causa de problemas de colisão - duas senhas diferentes, possivelmente gerando o mesmo md-5.

Sha-1 seria bastante seguro para isso. O motivo pelo qual você armazena a versão sha-1 salgada da senha é para que você não mantenha a senha do usuário no arquivo, que pode estar usando com os servidores de outras pessoas. Caso contrário, que diferença isso faz?

Se o hacker rouba todo o seu banco de dados não criptografado de alguma forma, a única coisa que uma senha salgada hashed faz é evitar que ele personifique o usuário para futuras assinaturas - o hacker já possui os dados.

De que adianta o invasor ter o valor com hash, se o que o usuário insere é uma senha simples?

E mesmo se o hacker com tecnologia futura pudesse gerar um milhão de chaves sha-1 por segundo para um ataque de força bruta, o seu servidor lidaria com um milhão de logons por segundo para o hacker testar suas chaves? Isso se você permitir que o hacker tente fazer logon com o sha-1 salgado em vez de uma senha como um logon normal.

A melhor opção é limitar as tentativas de logon incorretas a um número razoável - 25 por exemplo e, em seguida, desligar o usuário por um minuto ou dois. E se as tentativas de logon cumulativas do bady atingirem 250 dentro de 24 horas, desligue o acesso à conta e envie um e-mail ao proprietário.


Nem. Você deve usar bcrypt . Os hashes que você mencionou são todos otimizados para serem rápidos e fáceis em hardware, e assim quebrá-los compartilham as mesmas qualidades. Se você não tem outra escolha, pelo menos, certifique-se de usar um longo sal e re-hash várias vezes.

Usando o bcrypt no PHP 5.5+

O PHP 5.5 oferece novas funções para hashing de senha . Essa é a abordagem recomendada para o armazenamento de senhas em aplicativos da Web modernos.

// Creating a hash
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// If you omit the ['cost' => 12] part, it will default to 10

// Verifying the password against the stored hash  
if (password_verify($password, $hash)) {
    // Success! Log the user in here.
}

Se você estiver usando uma versão mais antiga do PHP, você realmente deve atualizar , mas até que você possa usar password_compat para expor esta API.

Além disso, por favor, deixe password_hash() gerar o sal para você. Ele usa um [CSPRNG] (http: //

Duas advertências do bcrypt

  1. O Bcrypt irá silenciosamente truncar qualquer senha com mais de 72 caracteres.
  2. Bcrypt truncará após qualquer caractere NUL .

( Prova de Conceito para ambas as advertências aqui.)

Você pode ficar tentado a resolver a primeira ressalva ao pré-hashing de suas senhas antes de executá-las através do bcrypt , mas isso pode fazer com que seu aplicativo seja executado de cabeça no segundo.

Em vez de escrever seu próprio esquema, use uma biblioteca existente escrita e / ou avaliada por especialistas em segurança.

TL; DR - Use bcrypt .


Todo mundo está falando sobre isso, como eles podem ser hackeados pela internet. Como já foi dito, limitar as tentativas torna impossível quebrar uma senha pela Internet e não tem nada a ver com o hash.

O sal é uma obrigação, mas a complexidade ou os múltiplos sais não importam. Qualquer sal sozinho impede que o invasor use uma tabela de arco-íris pronta. Um único sal por usuário impede que o atacante crie uma nova tabela de arco-íris para usar contra toda a sua base de usuários.

A segurança realmente entra em jogo quando todo o banco de dados é comprometido e um hacker pode executar 100 milhões de tentativas de senha por segundo em relação ao hash md5. O SHA512 é cerca de 10.000 vezes mais lento. Uma senha complexa com o poder de hoje ainda pode levar 100 anos para a bruteforce com md5 e levaria 10.000 vezes mais tempo com o SHA512. Os sais não impedem a força bruta como eles sempre devem ser conhecidos, o que, se o atacante baixou o seu banco de dados, ele provavelmente estava em seu sistema.


Use SHA256 . Não é perfeito, pois o SHA512 seria ideal para um hash rápido, mas fora das opções, é a escolha definitiva. De acordo com qualquer tecnologia de hashing, certifique-se de salgar o hash para maior segurança.

Como uma nota adicional, FRKT, por favor, mostre-me onde alguém pode facilmente quebrar um hash SHA256 salgado? Estou realmente muito interessado em ver isso.

Edição importante:

Seguindo em frente, use o bcrypt como um hash endurecido. Mais informações podem ser encontradas aqui .

Editar na salga:

Use um número aleatório, ou fluxo de bytes aleatórios, etc. Você pode usar o campo exclusivo do registro em seu banco de dados como o sal também, desta forma o sal é diferente por usuário.


Use argon2i . A função de hash de senha argon2 venceu a Competição de Hashing de Senha.

Outras opções razoáveis, se o uso do argon2 não estiver disponível, são scrypt , bcrypt e PBKDF2 . A Wikipedia possui páginas para estas funções:

MD5, SHA1 e SHA256 são resumos de mensagens, não funções hash de senha. Eles não são adequados para esse propósito.

Mudar de MD5 para SHA1 ou SHA512 não irá melhorar muito a segurança da construção. A computação de um hash SHA256 ou SHA512 é muito rápida. Um invasor com hardware comum ainda pode tentar dezenas de milhões (com uma única CPU) ou até bilhões (com uma única GPU) de hashes por segundo. Boas funções de hash de senha incluem um fator de trabalho para diminuir os ataques de dicionário.

Aqui está uma sugestão para programadores PHP: leia o FAQ do PHP e use password_hash() .





sha256