una start session_start recorrer matriz matrices imprimir hacer ejemplos dinamica dibujar crear como array 3x3 php mysql security passwords

session_start - session start php



Cómo almacenar mejor la información del usuario y el inicio de sesión y la contraseña del usuario (8)

¿Todos estos datos siempre tendrán una relación 1: 1 con el usuario? Si puede permitir que los usuarios tengan varias direcciones, números de teléfono, etc., puede dividir la información personal en una tabla separada.

Estoy usando Mysql y suponía que era mejor separar la información personal de un usuario y su nombre de usuario y contraseña en dos tablas diferentes y luego simplemente hacer una referencia entre las dos.

Nota : Para aclarar mi publicación, entiendo las técnicas para asegurar la contraseña (hash, salt, etc.). Solo sé que si sigo prácticas de otras partes de mi vida (inversión, copia de seguridad de datos, incluso almacenamiento personal), en el peor de los casos (tabla compuesta o incendio) que tener información dividida entre tablas proporciona la posibilidad de proteger su datos adicionales.


Debe almacenarlos en la misma tabla y usar encriptación unidireccional. MD5 funcionará, pero es débil, por lo que podría considerar algo como SHA1 u otro método. No hay beneficio para almacenar los 2 artículos en tablas separadas.


En mi experiencia personal, el almacenamiento de la información personal y la información de inicio de sesión en bases de datos individuales es la mejor práctica en este caso. La razón por la cual debe realizarse una inyección SQL es limitada (a menos que el infiltrado conozca el diseño interno de su base de datos) a la tabla a la que pertenecen los datos, en lugar de proporcionar acceso a todo el conglomerado de datos.

Sin embargo, tenga en cuenta que esto puede deberse a la necesidad de realizar más consultas, por lo tanto, un golpe de rendimiento.


En primer lugar, para indicar el (con suerte) obvio, si puede de ninguna manera evitar el almacenamiento de nombres de usuario y contraseñas; es una gran responsabilidad y si se infringe su tienda de credenciales, puede proporcionar acceso a muchos otros lugares para los mismos usuarios (debido al uso compartido de contraseñas).

Si debe almacenar credenciales:

  • No almacene una forma reversible; almacenar un hash utilizando un algoritmo reconocido como SHA-256. Utilice el software criptográfico de una fuente de confianza de buena reputación. NO INTENTE RODAR SU PROPIO, ES PROBABLE QUE LO HAGA EQUIVOCADO.
  • Para cada conjunto de credenciales, almacene una sal junto con los datos hash; esto se usa para "cebar" el hash de modo que dos contraseñas idénticas no produzcan el mismo hash, ya que eso revela que las contraseñas son las mismas.
  • Use un generador aleatorio seguro. La aleatoriedad débil es la causa principal de las fallas de seguridad relacionadas con el cifrado, no de los algoritmos de cifrado.

Si debe almacenar credenciales reversibles :

  • Elija un buen algoritmo de encriptación: AES-256, 3DES (fechado) o un cifrado de clave pública. Utilice el software criptográfico de una fuente de confianza de buena reputación. NO INTENTE RODAR SU PROPIO, ES PROBABLE QUE LO HAGA EQUIVOCADO.
  • Para cada conjunto de credenciales, almacene un sal (no encriptado) junto con los datos encriptados; esto se usa para "cebar" el cifrado de modo que dos contraseñas idénticas no produzcan el mismo texto de cifrado, ya que eso revela que las contraseñas son las mismas.
  • Use un generador aleatorio seguro. La aleatoriedad débil es la causa principal de las fallas de seguridad relacionadas con el cifrado, no de los algoritmos de cifrado.
  • Almacene las claves de cifrado / descifrado por separado de su base de datos, en un archivo seguro de O / S, accesible solo para su perfil de tiempo de ejecución de las aplicaciones. De esta forma, si su base de datos se infringe (por ejemplo, mediante inyección SQL), su clave no es automáticamente vulnerable, ya que eso requeriría acceso al HDD en general. Si su O / S es compatible con el cifrado de archivos vinculado a un perfil, úselo: solo puede ayudar y, en general, es transparente (por ejemplo, cifrado NTFS).
  • Si es práctico, almacene las claves encriptadas con una contraseña primaria. Esto generalmente significa su aplicación. necesitará la contraseña introducida al inicio; no es bueno proporcionarla en un parámetro de una secuencia de comandos, ya que si se rompe su HDD, debe suponer que se pueden ver tanto el archivo de la clave como la secuencia de comandos.
  • Si el nombre de usuario no es necesario para localizar el registro de la cuenta, encripte tanto el nombre de usuario como la contraseña.

Intentaré responder a tu pregunta original. Tener todo en una sola mesa está bien a menos que solo tenga mucha información personal para reunir. En ese caso, puede tener sentido dividirlo. Esa decisión debe tomarse en función de la cantidad de información personal con la que está tratando y la frecuencia con la que debe accederse.

Diría que la mayoría de las veces haría algo como esto en una sola mesa:

UserID, FirstName, LastName, Email, Password, TempPassword

Pero ... si estás reuniendo mucho más que eso. Digamos que está reuniendo teléfono, fax, fecha de nacimiento, biografía, etc., etc. Y si la mayoría de esa información rara vez se accede, probablemente la pondría en su propia mesa y la conectaría con una relación de uno a uno. Después de todo, cuantas menos columnas tenga en una tabla, más rápidas serán sus consultas contra esa tabla. Y a veces tiene sentido simplificar las tablas a las que más se accede. Sin embargo, hay un golpe de rendimiento con el JOIN cada vez que necesitas acceder a esa información personal, así que eso es algo que deberás considerar.

EDITAR - Sabes que, solo pensé en algo. Si crea un índice en el campo de nombre de usuario o correo electrónico (lo que prefiera), eliminará casi por completo el inconveniente de rendimiento de crear tantas columnas en una tabla de usuario. Lo digo porque cada vez que inicies sesión, la cláusula WHERE será extremadamente rápida para encontrar el nombre de usuario si tiene un índice y no importará si tienes 100 columnas en esa tabla. Así que cambié mi opinión. Lo pondría todo en una mesa. ;)

En cualquier caso, dado que la seguridad parece ser un tema popular, la contraseña debe ser un valor hash. Sugeriría SHA1 (o SHA256 si realmente te preocupa). TempPassword también debe usar un hash y solo está ahí para la funcionalidad de contraseña olvidada. Obviamente, con un hash no puede descifrar y enviar al usuario su contraseña original. En su lugar, generan una contraseña temporal con la que pueden iniciar sesión y luego les obligan a cambiar su contraseña nuevamente después de iniciar sesión.


Las contraseñas deben almacenarse como un hash criptográfico, que es una operación no reversible que impide leer el texto sin formato. Al autenticar usuarios, la entrada de contraseña se somete al mismo proceso de hash y se comparan los hashes.

Evite el uso de un hash rápido y barato como MD5 o SHA1; el objetivo es encarecer que un atacante calcule tablas de arcoiris (basadas en colisiones hash); un hash rápido contrarresta esto. El uso de un hash caro no es un problema para los escenarios de autenticación, ya que no tendrá ningún efecto en una sola ejecución del hash.

Además de hash, sal el hash con un valor generado aleatoriamente; un nonce, que luego se almacena en la base de datos y se concatena con los datos antes de hash. Esto aumenta la cantidad de combinaciones posibles que deben generarse al calcular las colisiones, y por lo tanto aumenta la complejidad general del tiempo de generación de tablas de arcoiris.

Su columna hash de contraseña puede tener una longitud fija; su hash criptográfico debe generar valores que pueden codificarse en una longitud fija, que será la misma para todos los hashes.

Siempre que sea posible, evite rodar su propio mecanismo de autenticación de contraseña; use una solución existente, como bcrypt .

En http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes puede encontrar una excelente explicación de cómo manejar contraseñas y qué necesita preocuparse. http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes .

Como nota final, recuerde que si un atacante obtiene acceso a su base de datos, entonces su preocupación inmediata debería ser con cualquier información sensible o de identificación personal a la que puedan tener acceso, y cualquier daño que puedan haber causado.


No almacene contraseñas. Si alguna vez está sentado en un disco, puede ser robado. En cambio, almacena hashes de contraseña. Use el algoritmo hash correcto , como bcrypt (que incluye una sal).

EDITAR : El OP ha respondido que entiende el problema anterior.

No es necesario almacenar la contraseña en una tabla físicamente diferente del inicio de sesión. Si una tabla de base de datos está en peligro, no es un gran salto para acceder a otra tabla en esa misma base de datos.

Si está suficientemente preocupado por la seguridad y la seguridad en profundidad, puede considerar almacenar las credenciales del usuario en un almacén de datos completamente independiente de los datos de su dominio. Un enfoque, comúnmente hecho, es almacenar credenciales en un servidor de directorio LDAP. Esto también podría ayudar con cualquier trabajo de inicio de sesión único que realice más tarde.


No hay nada de malo en ponerlos en la misma mesa. De hecho, sería mucho más rápido, así que lo recomendaría mucho. No sé por qué querrías dividirlo.