Memorizza password usando sha1 [duplicato]

6

Ho usato la funzione sha1() per la password hash prima di inserirla nel mio database. Ma ho questa procedura in modo che non sia la password da sottoporre a hash.

La mia pagina registrava un utente con la sua password. Dopo l'invio, inserirebbe prima il nome utente nel database, quindi ottenere l'ID univoco di tale nome utente. Quindi il sistema lo combinerà con la password.

$password = $userid.$password;

Quindi usa sha1() per cancellare la password:

$password = sha1($password);

Quindi aggiorna la password nel database con tale ID.

Ho usato l'id utente come un salt.

Domanda

Questa è una buona tecnica? Anche se gli unici utenti del sistema sono gli altri reparti della nostra azienda, penso che sia abbastanza per loro secondo me.

E se avessi un progetto importante in futuro che richiederebbe una maggiore sicurezza della password, sarà sufficiente? Grazie!

    
posta Logan Wayne 11.05.2015 - 09:57
fonte

4 risposte

15

Nessun sale non deve essere dissolto da altri parametri noti, un sale dovrebbe essere globalmente unico. Quindi il meglio che puoi fare è generare un sale veramente casuale per ogni password. I sistemi operativi odierni hanno una "fonte casuale", su un computer deterministico è il meglio che puoi fare per leggere da questa fonte casuale (DEV_URANDOM).

Accanto a questo, la famiglia di hash SHA- * non è appropriata per le password hash, perché questi algoritmi sono troppo veloci e quindi possono essere forzati brutalmente troppo facilmente ( 3Giga SHA1 / s ). Dovresti invece utilizzare una funzione di derivazione a chiave lenta con un fattore di costo, come BCrypt, PBKDF2 o SCrypt.

Per PHP esiste una funzione dedicata alle password hash, è progettata in un modo, quindi può cambiare l'algoritmo in futuro, se necessario, ma può comunque verificare i vecchi hash:

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

// This way you can define a cost factor (by default 10). Increasing the
// cost factor by 1, doubles the needed time to calculate the hash value.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));
    
risposta data 11.05.2015 - 10:29
fonte
6

Ci sono due cose che non vanno in quello che stai facendo con quello che stai facendo:

  • il tuo algoritmo nella sua forma semplice è veloce e quindi non adatto per l'hashing della password. (le proprietà che si desidera in un algoritmo di hashing della password sono abbastanza veloci da essere eseguite una volta, ma lente se è necessario eseguirlo più volte e non essere amichevoli quando vengono eseguite su FPGA / ASIC o GPU.
  • La tua salatura è pessima . Un sale dovrebbe essere globalmente unico, il che significa che dovrebbe avere un livello di casualità che è così raro, che non esiste alcuna possibilità che si sia verificato come sale prima in qualsiasi parte del mondo. Questo per prevenire attacchi in cui sono stati trapelati diversi database, poiché è probabile che gli utenti utilizzeranno nuovamente il loro nome utente. Pertanto è una cattiva pratica utilizzare un nome utente come salt, in quanto può essere univoco per il tuo database, non sarà per un altro database che utilizza lo stesso principio.

Ci sono attualmente tre algoritmi accettati: bcrypt, scrypt e pbkdf2.

    
risposta data 11.05.2015 - 10:35
fonte
3

Un inconveniente di SHA1 è che è veloce, quindi è più facile creare tabelle arcobaleno e forzarlo brute-force. Aggiungere un salt aiuta, ma se la password è debole, allora "numero + password debole" potrebbe essere nelle tabelle arcobaleno insieme con la password.

PHP fornisce meccanismi di password incorporati . Quando li usi, la funzione crypt genera automaticamente un sale per te che è memorizzato con la password hash + sale .
Questo è il modo consigliato di usare gli hash delle password (salate) in PHP.

    
risposta data 11.05.2015 - 10:21
fonte
-1

La semplice memorizzazione della password usando sha1 / md5 o qualsiasi funzione di hashing non è una buona pratica. Molti siti stanno fornendo un dizionario per rompere queste password.

La soluzione è usare un potente sale per aggiungere la password, quindi convertirlo in sha1 shash. Stai utilizzando una base molto semplice o una sorta di semplice padding.

Puoi usare rand, time stamp, double hashing come salt. Le prestazioni ti costeranno ancora di più, ma la tua app sarà protetta.

    
risposta data 11.05.2015 - 14:28
fonte

Leggi altre domande sui tag