pgcrypto example bcryptpasswordencoder security postgresql hash cryptography salt

security - example - hash postgresql



¿Cómo puedo hash contraseñas en postgresql? (3)

Ejemplos y documentación en: pgcrypto

UPDATE ... SET pswhash = crypt(''new password'', gen_salt(''md5'')); SELECT pswhash = crypt(''entered password'', pswhash) FROM ... ;

Necesito hash algunas contraseñas con sal en postgresql, y no he podido encontrar ninguna documentación relevante sobre cómo hacerlo.

Entonces, ¿cómo puedo hash contraseñas (con algunas sales) en postgresql?


Ha pasado un tiempo desde que hice esta pregunta, y estoy mucho más familiarizado con la teoría criptográfica ahora, así que aquí está el enfoque más moderno:

Razonamiento

  • No use md5. No utilice un solo ciclo de hashes rápidos de sha-family. Los hashes rápidos ayudan a los atacantes, por lo que no quieres eso.
  • En su lugar, utilice un hash que requiera muchos recursos, como bcrypt. Bcrypt es probado en el tiempo y se amplía para poder ser preparado para el futuro.
  • No se moleste en rodar su propia sal, puede arruinar su propia seguridad o portabilidad, confíe en gen_salt () para generar sus increíbles sales exclusivas para cada uso por sí mismo.
  • En general, no seas idiota, no trates de escribir tu propia criptografía casera, solo usa lo que las personas inteligentes han proporcionado.

Paquetes de instalación de Debian / Ubuntu

sudo apt-get install postgresql // (of course) sudo apt-get install postgresql-contrib libpq-dev // (gets bcrypt, crypt() and gen_salt()) sudo apt-get install php5-pgsql // (optional if you''re using postgresql with php)

Activa crypt () y bcrypt en postgresql en tu base de datos

// Create your database first, then: cd `pg_config --sharedir` // Move to the postgres directory that holds these scripts. echo "create extension pgcrypto" | psql -d yOuRdATaBaSeNaMe // enable the pgcrypo extension

Usa crypt () y gen_salt () en consultas

Comparar: pasar al hash existente con:

select * from accounts where password_hash = crypt(:pass, password_hash); //(note how the existing hash is used as its own individualized salt)

Crea un hash de: contraseña con una gran sal al azar:

insert into accounts (password) values crypt(:password, gen_salt(''bf'', 8)); //(the 8 is the work factor)

El hashing From-in-Php bcrypt es ligeramente preferible

Hay funciones password_* en php 5.5 y superiores que permiten el hash de contraseñas trivialmente simple con bcrypt (¡sobre tiempo!), Y hay una biblioteca de compatibilidad con versiones anteriores para las versiones inferiores. En general, ese hashing se reduce a envolver una llamada al sistema de Linux para un menor uso de la CPU de todos modos, aunque es posible que desee asegurarse de que esté instalado en su servidor. Ver: https://github.com/ircmaxell/password_compat (requiere php 5.3.7+)

Ten cuidado con la registración

Tenga en cuenta que con pg_crypto, las contraseñas están en texto claro durante la transmisión desde el navegador, a php, a la base de datos. Esto significa que pueden iniciar sesión en texto sin formato a partir de consultas si no tiene cuidado con los registros de su base de datos. por ejemplo, tener un registro de consulta lento postgresql podría atrapar y registrar la contraseña de una consulta de inicio de sesión en curso.

En resumen

Use php bcrypt si puede, se reducirá el tiempo que la contraseña permanece sin hilar. Intenta asegurarte de que tu sistema linux tiene instalado bcrypt en su crypt() para que funcione. Actualizarse al menos a php 5.3.7+ es muy recomendable ya que la implementación de php tiene errores de php 5.3.0 a 5.3.6.9, y vuelve incorrectamente al DES defectuoso sin previo aviso en php 5.2.9 y versiones anteriores.

Si quiere / necesita hash en postgres, la instalación de bcrypt es el camino a seguir, ya que los hashes instalados por defecto son viejos y están rotos (md5, etc.).

Aquí hay referencias para leer más sobre el tema:


Una aplicación debe hash sus contraseñas usando la función de derivación de claves como bcrypt o pbkdf2. Aquí hay más información sobre el almacenamiento seguro de contraseñas .

... pero a veces todavía necesita funciones criptográficas en una base de datos.

Puede usar pgcrypto para obtener acceso a sha256, que es miembro de la familia sha2. Tenga en cuenta que sha0, sha1 md4 y md5 están muy rotos y nunca deben usarse para hash de contraseñas.

El siguiente es un método correcto de contraseñas hash:

digest("salt"||"password"||primary_key, "sha256")

La sal debe ser un gran valor generado al azar. Esta sal debe estar protegida, porque los hashes no se pueden romper hasta que se recupere la sal. Si está almacenando la sal en la base de datos, puede obtenerla junto con el hash de la contraseña mediante la inyección sql. Concatenar la clave primaria se usa para evitar que 2 personas tengan el mismo hash de contraseña incluso si tienen la misma contraseña. Por supuesto, este sistema podría mejorarse, pero esto es mucho mejor que la mayoría de los sistemas que he visto.

En general, es mejor hacer hashing en su aplicación antes de que llegue a la base de datos. Esto se debe a que las consultas pueden aparecer en los registros, y si el servidor de la base de datos era propiedad, entonces podrían habilitar el registro para obtener contraseñas de texto sin cifrar.