///////////////////////////////// Publicación actualizada a continuación ///////////// ///////////////
Esta pregunta ha recibido muchos éxitos, más de lo que pensé que tendría en un tema tan básico. Entonces, pensé en actualizar a la gente sobre lo que estoy haciendo. También sigo leyendo en los comentarios que estoy almacenando contraseñas como texto sin formato. Solo para aclarar No lo soy.
Mi función de validación actualizada:
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
}
}
Cada vez que devuelve FALSE
, siempre les digo que se necesita la contraseña completa.
Solo para responder algunas de las preguntas sobre por qué es tan largo:
¿Por qué no tanto tiempo? Personas en mi trabajo con las que hablo usan oraciones. Muy largos en eso.
¿Cómo me hash de mis contraseñas? / ¿Por qué usar 100 caracteres? - > solo usa un mejor algoritmo de hash
Para PHP, estoy usando lo mejor que hay para este idioma. Estoy usando esta biblioteca que es la equivalencia de PHP 5.5 de nueva API de hashing de contraseña creada por Anthony Ferrara. Mi razonamiento para este hashing el uso es simple, muy alta demanda en la CPU (si alguna vez la prueba en una caja de Linux / Windows, el uso de la CPU es del 100%). Además, el algoritmo es muy escalable debido a que el factor de costo cuanto mayor es el costo, más ardua es la tarea para que la CPU inicie sesión una persona. Última I "Probado" , puse el costo a 24 Pasé una hora completa para intentar iniciar sesión y obtuve un error de tiempo de espera de PHP antes de que pasara por la pantalla de inicio de sesión (esto fue un factor de costo absurdo). Un estudio realizado por Jeremi Gosney (ESTA ES LA DESCARGA DEL INFORME EN PDF) que probó la potencia de esta función en comparación con otras más populares (sí, más popular) llegó a la conclusión de que incluso con 25 GPU, al usar bcrypt a un costo de 5 , hash de contraseña es la última de sus preocupaciones. Yo uso un costo de 17 ...
Mi función si alguien está interesado (al menos las partes que pertenecen a este tema):
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"]
Esperemos que esta pregunta ayude a otros por ahí.
///////////////////////////////// Post original a continuación ///////////// ///////////////
Actualmente estoy trabajando en un nuevo proyecto y se me ocurrió un problema.
¿Es seguro revelar sus requisitos de contraseña? Si es así, ¿por qué es seguro?
Tengo una función que realiza la validación de una contraseña y cada paso muestra al usuario por qué la validación no funciona.
Aquí está mi función:
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;
}
}
Mi pensamiento al respecto es si le permitimos al "usuario" / atacante saber en qué consisten mis contraseñas, ¿no sería más fácil para el atacante saberlo? Sé que la seguridad a través de la oscuridad no es una buena práctica, pero ¿podría ser un argumento sólido en esta situación?
Me gustaría saber si estoy haciendo esto de la manera correcta. Cualquier ayuda sería genial.