È possibile utilizzare password_verify () per identificare la password dopo la violazione del database?

5

Sono un principiante di PHP e hashing delle password. Sto seguendo le istruzioni fornite @ Safe Password Hashing per cancellare la mia password utente prima di memorizzarla.

Le mie domande sono:

  1. PHP consiglia il metodo password_hash() come modo sicuro preferito per l'hash. In caso di violazione del database, l'hacker non utilizzerà password_verify() e identificherà le password anziché utilizzare una tabella di ricerca dell'arcobaleno?

  2. Se sì, quale dovrebbe essere il mio approccio per colmare questo gap di sicurezza?

posta Mr.X 18.11.2014 - 14:15
fonte

4 risposte

5

password_verify() richiede due argomenti: una stringa di cui si desidera verificare se è la password corretta e il valore calcolato in precedenza con password_hash() , che presumibilmente si è archiviato da qualche parte in un database o giù di lì.

Un'applicazione tipica potrebbe essere:

<?php
$hash = password_hash('my-secret', PASSWORD_DEFAULT);
// normally you would save the hash somewhere, but we'll just continue in this example

$check_a = 'other-secret';
$check_b = 'my-secret';
if (password_verify($check_a, $hash))
   echo 'Check A was the original password: ' . $check_a;
if (password_verify($check_b, $hash))
   echo 'Check B was the original password: ' . $check_b;

L'output sarà:

Check B was the original password: my-secret

Se vuoi ottenere la password originale da un hash calcolato da password_hash() , dovrai provare tutte le possibilità - questo è ciò che mostra questo esempio. A causa dell'architettura di password_hash() , trovare una password come questa richiederà molto tempo, quindi non ne vale la pena.

Nota anche, dal password_hash() doc :

PASSWORD_DEFAULT - Use the bcrypt algorithm (default as of PHP 5.5.0). Note that this constant is designed to change over time as new and stronger algorithms are added to PHP. For that reason, the length of the result from using this identifier can change over time. Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice).

L'algoritmo è progettato per cambiare nel tempo, in modo che rimanga sicuro, e trovare una password con la forza bruta non sarà possibile con i computer più veloci (presumendo, l'installazione di PHP sul server è aggiornata)

In ogni caso, un hash è a senso unico: non puoi girarlo. Puoi solo verificare una determinata password calcolando l'hash di quello e verificando se è la stessa.

    
risposta data 18.11.2014 - 14:32
fonte
0

password_verify() confermerà solo se una determinata password corrisponde all'hash specificato. Richiede ancora un input e le tabelle Rainbow sono un modo per generare possibili password per l'input. Tuttavia, se stai generando un valore salato di dimensioni consigliate, questo ti aiuterà a proteggerti dagli attacchi della tabella arcobaleno.

Puoi trovare ulteriori informazioni sulla protezione corretta delle password utilizzando hash e sali leggendo Come bloccare in modo sicuro le password .

    
risposta data 18.11.2014 - 14:28
fonte
0

Poiché le funzioni di hash sono davvero difficili da invertire, non è possibile dedurre semplicemente una soluzione fornendo l'hash. Esiste una probabilità trascurabile che un utente malintenzionato possa sviluppare una strategia per trovare una password che corrisponda a quella che si memorizza nel database. Non so quale sia il metodo di hash predefinito di PHP, ma tutti i moderni algoritmi di hashing sono resistenti alle collisioni, quindi non preoccuparti.

    
risposta data 18.11.2014 - 23:10
fonte
0

L'unico modo per ottenere la vera password è usare un attacco di forza bruta sulla password con hash, dato che l'algoritmo hash della password php predefinito è bcrypt, ci vorrebbe un sacco di tempo.

    
risposta data 11.11.2015 - 22:37
fonte

Leggi altre domande sui tag