2013-01-21 3 views
10

Eventuali duplicati:
Secure hash and salt for PHP passwordsUsername, Password, Salting, Encrypting, Hash - Come funziona tutto?

Iv'e letto un sacco di posti, sia in StackOverflow e altri siti web che parlano di sicurezza del web. Come la salatura della crittografia, ecc. E non sto ottenendo così una semplice spiegazione sarebbe davvero utile.

Quindi ecco quello che so finora. Un utente accede digitando nome utente e password. L'input quindi passa attraverso un processo. Diciamo che il nome utente e la password sono combinati come ad esempio:

$username = (USERS USERNAME INPUT); 
$password = (USERS PASSWORD INPUT); 
$userinput = $username . $password; 

Quindi aggiungiamo un po 'di sale.

$salt1 = "13$13aVc!kd"; 
$salt2 = "4kr$!vlmeoc"; 

$salted = $salt1 . $userinput . $salt2; 

Quindi lo crittografiamo.

$encrypted = encrypt($salted); 

Poi verificare con il database e se il suo diritto utente viene connesso.

è così che funziona a destra? Ma ho letto di un attacco di forza bruta. Indovina i valori di input giusto? Con la procedura sopra. Non mostra che l'hacker ha solo bisogno di ottenere le informazioni $ userinput corrette per entrare? Non ha bisogno di indovinare la lunga stringa $ cifrata corretta?

Nota: diciamo che in questa situazione non c'è captcha, nessun limite di tentativi, nessun blocco, nient'altro che quello sopra.

Nota: Sii gentile, sto ancora imparando.

+1

Ecco perché gli utenti si consiglia di utilizzare password complessa invece di "12345", ma la forza bruta è possibile nello scenario .. – Deadlock

+0

così il sale e la crittografia è inutile? –

+0

Un po ', ma la data di pubblicazione se il dirottamento intermedio non sarà di alcuna utilità per i dirottatori poiché sarà in una stringa crittografata e non può essere annullato finché non ha un valore di sale. – Deadlock

risposta

7

Se si escludono i captcha, provare i limiti, i blocchi, eccetera ... quindi sì. Devi solo forzare la stringa di testo in chiaro.

Tuttavia, questo richiede il tempo - per lo meno, è limitato dalla velocità con cui il server risponderà alle richieste di accesso. Anche se lo sviluppatore non aggiunge alcuna misura per prevenire la forzatura bruta, il server stesso può passare attraverso la procedura di crittografia + verifica in modo così rapido e può gestire solo così tante richieste parallele.

Ciò detto, questo è il motivo per cui è importante

  • Come utente, utilizzare una password complessa, difficile da forza bruta
  • Come sviluppatore, hanno misure adeguate per prevenire bruta forzatura della vostra processo di login

di hashing e le password di salatura, non è quello di proteggere contro le persone che forza bruta il processo di login naturale (ci sono altre cose che proteggono contro quello). Invece, devono proteggere da potenziali compromissioni della stessa memorizzazione della password (ad esempio qualcuno che scarica i contenuti del database).

Sia hashing e salatura servono a diminuire la velocità in cui qualcuno con accesso alle password memorizzate in grado di recuperare la stringa di testo normale che avevano bisogno di essere in grado di passare attraverso il processo di login naturale (del tuo sito o altri siti, dato che le password vengono comunemente condivise tra i siti) senza inciampare nelle misure di sicurezza anti-brute.

+0

@ user1429811 Se desideri ulteriori letture, ho un intero post sul blog su questo argomento qui: http://codingkilledthecat.wordpress.com/2012/09/04/some-best-practices-for-web-app -autenticazione/ – Amber

2

L'idea di hashing e salatura è più per impedire a qualcuno di prendere le password degli utenti se il database stesso è compromesso. Se le password sono memorizzate come stringhe salate e con hash, l'utente malintenzionato non può semplicemente utilizzarle per accedere all'account di un utente su un altro sito.

1

La crittografia della password è una crittografia unidirezionale (o meglio è supposta di essere in un sito sicuro). Vale a dire che prendi la password e fai un hash. bcrypt per esempio è lo standard accettabile per farlo oggi.

Se la crittografia a senso unico molte persone si chiedono come sia possibile controllare una password. Ma hai appena cancellato la password che l'utente invia e la confronta con quale hash hai memorizzato nel database. In questo modo se il tuo database viene rubato, un utente malintenzionato deve lavorare molto più duramente.

Il problema con l'hashing di una password è facilmente forzato bruto o arcobaleno presentato. Puoi google rainbow table per saperne di più su questo. Ma essenzialmente è un modo per trasformare questi hash in password.

Immettere salatura. Salting aggiunge dati casuali essenzialmente ad ogni password. Questo trionfa sulle tavole arcobaleno. Il significato di un database compromesso significherà forza bruta. Che se stai usando un sistema di hash come bcrypt richiede un sacco di tempo e fatica per l'attacco.

Detto questo. Meglio non reinventare la ruota. Usa un buon sistema di autorizzazione noto, se puoi.

0

Vedere la mia risposta here

e si dovrebbe generare sali unici per ogni voce quando si crea l'hash.

0

Un problema con gli attacchi di forza bruta è quando si utilizza una crittografia veloce come SHA1 o MD5. Queste funzioni sono create per eseguire rapidamente la password tramite un algoritmo. Invece si potrebbe usare il metodo Blowfish, che non è esperto, ma per farla breve serve più calcoli per un valore restituito, che SHA1 o MD5. Ciò significa che potrebbero essere necessari 5 anni per forzare una password, hash con Blowfish a causa del tempo di calcolo.

Il prossimo esempio è realizzato con SHA1 e MD5, quindi è vulnerabile a bruteforzare attacchi, ma la parte di sale dovrebbe essere OK per utilizzare:

$salt = md5(microtime().uniqueid()); 

Questa uscita volontà di un unico sale 32 charecter, che si vuole mettere insieme con la password.

$passwod = $_POST['password']; 
$hashed_password = sha1($password.$salt); 

Ora è necessario memorizzare sia la password che il sale nel database. E quando controlli la password inputtet dell'utente ottieni il sale e l'hash l'intera cosa.

$temp_pass = $_POST['temp_pass']; 
$salt = //from database; 
$database_pass = //hashed pass from database; 

$hashed_temp_pass = sha1($temp_pass.$salt); 

if(hashed_temp_pass == $database_pass){ 
//Welcome user! 
} 
else{ 
//go away 
}