Modo Paranoico ON
Post Original: https://albertobsd.dev/blog/es/2020/01/no-guardar-email-en-texto-plano/
Déjame repetirte el titulo
No guardar el email en texto plano en la base de datos, No se necesita, no se requiere, es mas seguro.
Según esta publicación (Lectura recomendada)
https://medium.com/@alex.birsan/the-bug-that-exposed-your-paypal-password-539fc2896da9
Bug bounty de 15mil $ USD
Si nos ponemos paranoicos, no deberías de conocer el email del usuario, No se necesita, no se requiere.
¿Que dato valido entonces? Un hash del mismo email protegido con alguna key, Importante: Que no sea reversible es decir que teniendo el hash no exista forma de volver al email y/o password originales.
Los siguientes códigos requieren de un archivo key_db.dat el cual se puede generar con dd leyendo de /dev/random o con el método que mas les guste.
Nota que coloque Iteraciones igual a 2 Millones ya que no sabemos en un futuro que tan feasible sea realizar algun forcebrute a los hashes.
NO SE NECESITA GUARDAR EL EMAIL EN PLANO
- El usuario no se acuerda de su clave? Pides el email y aplicas el mismo algoritmo, se busca en la base de datos y si coincide con alguno de los hash envias el email, basándose en el email que te enviaron obviamente validando que sea email valido filter_var($email, FILTER_VALIDATE_EMAIL)
NO SE NECESITA, ok quieres enviarles noticias o mensajes cada X tiempo
- Se puede utilizar criptografía simétrica para guardar el email pero si te hackean la base de datos y el código fuente, lo van a poder obtener ellos mismos
déjame Repetírtelo una vez mas NO SE NECESITA GUARDAR EL EMAIL EN TEXTO PLANO
Incluso solo se necesita recibir el email en texto plano en 2 ocasiones, solo cuando se registra (Para validar que sea valido) y cuando quiere recuperar su password.
Para el login diario podrías recibir solo un hash del mismo
var email = CryptoJS.SHA512($("#email").val()).toString().substring(1, 127);
Se le quitan 2 nibbles de los extremos al hash antes de ser enviado, por si se llega a interceptar en transito por algun exploit, no se pueda determinar al 100% cual es el email inicial
Se podría aplicar lo mismo al password (Muy recomendable asi tu nunca vez el password original del usuario)
Saludos!
Post Original: https://albertobsd.dev/blog/es/2020/01/no-guardar-email-en-texto-plano/
Déjame repetirte el titulo
No guardar el email en texto plano en la base de datos, No se necesita, no se requiere, es mas seguro.
Según esta publicación (Lectura recomendada)
https://medium.com/@alex.birsan/the-bug-that-exposed-your-paypal-password-539fc2896da9
Bug bounty de 15mil $ USD
Si nos ponemos paranoicos, no deberías de conocer el email del usuario, No se necesita, no se requiere.
¿Que dato valido entonces? Un hash del mismo email protegido con alguna key, Importante: Que no sea reversible es decir que teniendo el hash no exista forma de volver al email y/o password originales.
Los siguientes códigos requieren de un archivo key_db.dat el cual se puede generar con dd leyendo de /dev/random o con el método que mas les guste.
Código (php) [Seleccionar]
/*
metodo con hash_pbkdf2
*/
$halgo = "sha256";
$iterations = 2000000;
$email = "user@example.com";
$password = "P4ssw0rd";
$salt = hash_file($halgo,"key_db.dat",true);
$salida_email = hash_pbkdf2($halgo,$email,$salt,$iterations,0);
$salida_password = hash_pbkdf2($halgo,$password,$salt,$iterations,0);
echo "hash email: $salida_email\n";
echo "hash password: $salida_password\n";
/*
metodo Iterativo con hash_hmac ()
*/
$i = 0;
$data_email = substr($email,0);
$data_password = substr($password,0);
do {
$data_email = hash_hmac($halgo,$data_email,$salt,true);
$data_password = hash_hmac($halgo,$data_password,$salt,true);
}while($i++ < ($iterations - 1));
$data_email = hash_hmac($halgo,$data_email,$salt,false);
$data_password = hash_hmac($halgo,$data_password,$salt,false);
echo "hash email: $data_email\n";
echo "hash password: $data_password\n";
/*
metodo Iterativo solo con hash (data y key concatenadas)
*/
$i = 0;
$data_email = substr($email,0);
$data_password = substr($password,0);
do {
$data_email = hash($halgo,$data_email.$salt,true);
$data_password = hash($halgo,$data_password.$salt,true);
}while($i++ < ($iterations - 1));
$data_email = hash($halgo,$data_email.$salt,false);
$data_password = hash($halgo,$data_password.$salt,false);
echo "hash email: $data_email\n";
echo "hash password: $data_password\n";
Nota que coloque Iteraciones igual a 2 Millones ya que no sabemos en un futuro que tan feasible sea realizar algun forcebrute a los hashes.
NO SE NECESITA GUARDAR EL EMAIL EN PLANO
- El usuario no se acuerda de su clave? Pides el email y aplicas el mismo algoritmo, se busca en la base de datos y si coincide con alguno de los hash envias el email, basándose en el email que te enviaron obviamente validando que sea email valido filter_var($email, FILTER_VALIDATE_EMAIL)
NO SE NECESITA, ok quieres enviarles noticias o mensajes cada X tiempo
- Se puede utilizar criptografía simétrica para guardar el email pero si te hackean la base de datos y el código fuente, lo van a poder obtener ellos mismos
déjame Repetírtelo una vez mas NO SE NECESITA GUARDAR EL EMAIL EN TEXTO PLANO
Incluso solo se necesita recibir el email en texto plano en 2 ocasiones, solo cuando se registra (Para validar que sea valido) y cuando quiere recuperar su password.
Para el login diario podrías recibir solo un hash del mismo
var email = CryptoJS.SHA512($("#email").val()).toString().substring(1, 127);
Se le quitan 2 nibbles de los extremos al hash antes de ser enviado, por si se llega a interceptar en transito por algun exploit, no se pueda determinar al 100% cual es el email inicial
Se podría aplicar lo mismo al password (Muy recomendable asi tu nunca vez el password original del usuario)
Saludos!