/////////////////////////////// Updated Post Below ////////////////////////////
Questa domanda ha ricevuto molti successi, più di quanto avessi mai pensato avrebbe avuto su un argomento così fondamentale. Quindi, ho pensato di aggiornare le persone su quello che sto facendo. Inoltre continuo a leggere nei commenti che sto memorizzando le password come testo normale. Giusto per chiarire Non lo sono.
La mia funzione di convalida aggiornata:
public function is_password($str) {
if (strlen($str) < 10) { // Less then 10
$this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
return FALSE;
} elseif (strlen($str) > 100) { // Greater then 100
$this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
return FALSE;
} elseif (!preg_match("#[0-9]+#", $str)) { // At least 1 number
$this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
return FALSE;
} elseif (!preg_match("#[a-z]+#", $str)) { // At least 1 letter
$this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
return FALSE;
} elseif (!preg_match("#[A-Z]+#", $str)) { // At least 1 capital
$this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
return FALSE;
} elseif (!preg_match("#\W+#", $str)) { // At least 1 symbol
$this -> set_message('is_password', 'Password must include at least one number, one letter, one capital letter , one symbol and be between 10 and 100 characters long.');
return FALSE;
} else {
return TRUE; // No errors
}
}
Ogni volta che restituisce FALSE
, dico sempre loro che è necessaria l'intera password.
Solo per rispondere ad alcune domande sul motivo per cui è così lungo:
Perché non così tanto tempo? Le persone nel mio lavoro con cui parlo usano frasi. Quelli molto lunghi.
Come faccio a tagliare le mie password? / Perché usare 100 caratteri? - > basta usare un algoritmo di hashing migliore
Per PHP, sto usando il meglio che c'è per questa lingua. Sto usando questa libreria che è l'equivalenza di PHP 5.5 di nuova API hashing password creata da Anthony Ferrara. Il mio ragionamento per questo hashing l'uso è semplice, molto elevato nella CPU (se lo provi su una macchina Linux / Windows l'utilizzo della CPU è al 100%). Inoltre, l'algoritmo è molto scalabile a causa del fattore costo, più alto è il costo, più faticoso è il compito della CPU di registrare una persona. Last I "Tested" , ho messo il costo a 24 Mi è passata un'intera ora per provare ad accedere e ho ricevuto un errore di timeout PHP prima ancora di aver superato la schermata di accesso (questo era un fattore di costo folle). Uno studio condotto da Jeremi Gosney (QUESTO È IL DOWNLOAD PDF DEL REPORT) che ha testato la forza di questa funzione rispetto ad altri più popolari (sì, più popolari) ha concluso che anche con 25 - GPU, mentre si utilizza bcrypt al costo di 5 l'hashing della password è l'ultimo dei tuoi dubbi. Io uso un costo di 17 ...
La mia funzione se qualcuno è interessato (le parti che riguardano almeno questo argomento):
public function create_user($value) {
$this -> CI = get_instance();
$this -> CI -> load -> library('bcrypt');
foreach ($value as $k => $v) {// add PDO place holder to the keys
$vals[":$k"] = $v;
}
$vals[":password"] = $this -> CI -> bcrypt -> password_hash($vals[":password"], PASSWORD_BCRYPT, array("cost" => 17)); // Take old $vals[":password"] and run it through bcrypt to come up with the new $vals[":password"]
Speriamo che questa domanda aiuti gli altri là fuori.
/////////////////////////////// Original Post Below ////////////////////////////
Attualmente sto lavorando a un nuovo progetto e un problema mi ha colpito.
È sicuro divulgare i requisiti della password? Se è così, perché è sicuro?
Ho una funzione che esegue la convalida su una password e ogni fase mostra all'utente perché la convalida non funziona.
Ecco la mia funzione:
public function is_password($str) {
if (strlen($str) < 10) {
$this -> set_message('is_password', 'Password too short.');
return FALSE;
} elseif (strlen($str) > 100) {
$this -> set_message('is_password', 'Password is too long.');
return FALSE;
} elseif (!preg_match("#[0-9]+#", $str)) {
$this -> set_message('is_password', 'Password must include at least one number.');
return FALSE;
} elseif (!preg_match("#[a-z]+#", $str)) {
$this -> set_message('is_password', 'Password must contain at least one letter.');
return FALSE;
} elseif (!preg_match("#[A-Z]+#", $str)) {
$this -> set_message('is_password', 'Password must contain at least one capital letter.');
return FALSE;
} elseif (!preg_match("#\W+#", $pwd)) {
$this -> set_message('is_password', 'Password must include at least one symbol.');
return FALSE;
} else {
return TRUE;
}
}
Il mio pensiero su questo è, se lasciamo che l'utente / utente malintenzionato sappia in cosa consistono le mie password, non sarebbe più facile per l'hacker saperlo? So che la sicurezza attraverso l'oscurità non è una buona pratica, ma potrebbe essere un argomento valido in questa situazione?
Vorrei sapere se sto andando su questo nel modo giusto. Qualsiasi aiuto sarebbe fantastico.