password_verify password_hash password_bcrypt password encriptar encriptada ejemplo desencriptar contraseña con php passwords

password_hash - La mejor forma de codificar contraseñas en PHP



password_hash php ejemplo (8)

Base64Encode no ofrece seguridad, porque cualquiera puede revertirlo fácilmente.

Si necesita revertir la contraseña, una buena forma es usar una pregunta secreta y usar la respuesta como clave de cifrado. Una vez que la contraseña está encriptada, descarta la respuesta (no la almacena). También utiliza el cifrado sha1 estándar para el momento en que necesita verificar que ingresó la contraseña correcta. Si el usuario quiere su contraseña, ingrese la respuesta a su pregunta secreta, y la usa para restaurar la contraseña y devolvérselo.

No es tan seguro como el cifrado basado en hash solamente, pero si necesita devolver la contraseña es un buen compromiso.

Es posible que desee consultar la biblioteca mcrypt para php http://ca3.php.net/mcrypt

Actualmente uso,
base64_encode () para codificar la contraseña de un usuario, esto funciona bien porque me permite simplemente usar base64decode () para decodificar la contraseña de una palabra y enviar a su cuenta si pierden su contraseña.

Sin embargo, he estado leyendo sobre la contraseña y mucha gente parece decir que debería usar sha1 () para codificar una contraseña. Estoy totalmente a favor de mejorar la seguridad de mi sistema, pero si convierto para usar shal () entonces no podré enviar a un usuario la contraseña perdida.

¿Que usas? ¿Me puedes dar algún consejo? ¿Y hay una forma de descifrar una contraseña legible para enviar un correo electrónico a un usuario?

Mientras escribía esta pregunta, me acordé de que algunos foros no te envían una contraseña cuando te lo solicitan, sino que envían un enlace especial para restablecer tu contraseña. Supongo que esto se debe a que quizás no puedan decodificar tu contraseña.

//what I use now $password_encoded = base64_encode($password); //what I am considering using $password_encoded = sha1($password);


Como administrador, nunca necesita recordar la contraseña de un usuario . Simplemente necesita saber si una cadena que presentaron una vez es idéntica a otra.

Si un usuario olvida su contraseña, no es necesario que le digan su contraseña anterior, simplemente puede hacer que proporcione una nueva.

Ya que no necesita conocer las contraseñas reales, usar un hash criptográfico de las palabras parecería una forma segura de almacenarlas. Sin embargo, se han creado grandes tablas de cadenas precalculadas para realizar fácilmente una búsqueda inversa de la cadena original. Estas se llaman tablas de arcoiris .

Para evitar la búsqueda fácil de cadenas pre calculadas, debe saltear sus contraseñas antes de hacer hash. La sal puede ser su nombre de usuario antepuesto, o su ID de usuario postfixed, cualquier información adicional que tenga en el usuario que sea permanente que pueda agregar fácilmente a la contraseña durante la autenticación.


Debe dejar que un usuario REINICIE una contraseña pero nunca RECUPERAR su contraseña. Es por eso que desearía utilizar un hash de una vía (SHA2) en lugar de una forma de cifrado que le permita decodificarlo.

Imagina si dejaras tu correo electrónico abierto. Simplemente podría solicitar recuperar su contraseña para algún sitio web, eliminar el correo electrónico, y nunca lo sabría. Por otro lado, si me pedías que restableciera la contraseña, la contraseña de la cuenta cambiaría y el propietario obviamente se daría cuenta de que algo anda mal. (Este es un escenario tonto pero el concepto es lo importante)

Los valores hash se pueden "revertir" probando todas las combinaciones posibles de palabras (o usando tablas rainbow) hasta que se produzca un hash coincidente. Una forma de evitar esto es agregar / anteponer la contraseña proporcionada con un salt para que sea una cadena muy larga e impredecible. La sal debe ser una cadena única de datos única para la cuenta del individuo.

En PHP no hay función SHA2. SHA-2 es una familia de algoritmos hash, (SHA-256, SHA-384, SHA-512, etc.)

hash(''sha256'', ''The quick brown fox jumped over the lazy dog.'');


Querrá usar un hash (preferiblemente sha1) con "sal"


Siempre elimino mi cuenta solo los sitios que me envían mi contraseña por correo electrónico. Dediqué demasiado esfuerzo y tiempo a memorizar largas contraseñas aleatorias para que me las enviaran en texto sin formato.

Use sha1 () o hash no reversible superior para identificar la contraseña. Al autenticar una contraseña de usuario, recupere el hash y compárelo con el hash de la contraseña proporcionada durante la autenticación. Si coinciden, entonces el usuario es auténtico dentro de los estándares razonables.

$user = "joe"; $password = ''password''; $saved_hash = DB::Query("select hash from users where username = ".quote($user)." LIMIT 1"); if (sha256($password) == $saved_hash) User::authenticated();

Nunca, nunca envíe contraseñas por correo electrónico. Envíe una clave generada única, no predecible, como en PHP:

$key = sha256(time().rand().$secret_seed);

Envíe esta clave al cliente, para un uso único, para establecer una nueva contraseña.


Una lectura obligada absoluta sobre este tema es la propia de Jeff . Probablemente está almacenando contraseñas incorrectamente . Aquí está el resumen ejecutivo:

  1. No invente su propio esquema de almacenamiento de contraseñas "inteligente".
  2. Nunca almacene contraseñas como texto sin formato.
  3. Agregue una sal aleatoria larga y única a cada contraseña que almacene.
  4. Use un hash criptográficamente seguro.

Puede realizar el hash en el servidor al autenticarse en una consulta rápida:

SELECT * FROM user WHERE password = MD5(CONCAT(?, salt));


¡Por favor, por el bien de sus usuarios, no almacene sus contraseñas en ningún formato reversible! No importa si se trata de encriptación codificada en Base64 o Triple DES de 168 bits ; si es reversible, es exactamente tan segura como si no la codificara en absoluto .

Ningún sitio web que tenga interés en protegerse a sí mismo o a sus usuarios (o tiene sentido común) enviará a un usuario su contraseña por correo electrónico. Lo único que podemos hacer, incluso remotamente cerca de la seguridad, es enviar a los usuarios un correo electrónico con un enlace único de uso único que les permite establecer una nueva contraseña.

  • Almacene un hash ( bcrypt o PBKDF2 ) de la contraseña que se ha salado
  • Bote la contraseña original tan pronto como la haya procesado. Excluirlo de la memoria.
  • Siempre requiere que el usuario cree su propia contraseña a través de un canal SSL

Tratar de salir adelante con cualquier otra cosa es honestamente solo negligencia. Usemos un escenario muy común utilizado en las discusiones de seguridad:

El correo electrónico del usuario Frederic está comprometido. Esto podría ser dejar su computadora desbloqueada o usar una contraseña débil. De todos modos, una persona no autorizada tiene acceso a sus mensajes. Idealmente, esto no significaría nada más que algunas cartas de amor embarazosas leídas por un extraño. Lamentablemente, la persona no autorizada descubre que un foro le enviará la contraseña de Frederic en texto sin formato. Al igual que la mayoría de los usuarios, Frederic usa la misma contraseña para todo, incluida su banca en línea. Su nombre de usuario aparece en un correo electrónico de su banco. Ahora la situación es muy desafortunada.

Los usuarios confían en usted cuando crean una relación basada en credenciales con usted. Parte de esa confianza es que mantendrá esas credenciales como un secreto seguro entre usted y ellos.

Relacionado

Muchos de los problemas e ideas que nos rodean han sido respondidos muy bien en SO: