sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo puedo codificar contraseñas en postgresql?

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

Razonamiento

  • No use md5. No use un solo ciclo de hashes rápidos de la familia sha. Los hashes rápidos ayudan a los atacantes, así que no quieres eso.
  • Use un hash de uso intensivo de recursos, como bcrypt, en su lugar. Bcrypt está probado en el tiempo y se amplía para ser apto para el futuro.
  • No se moleste en crear su propia sal, puede estropear su propia seguridad o portabilidad, confíe en gen_salt() para generar sus increíbles sales únicas para cada uso por sí mismo.
  • En general, no seas idiota, no intentes escribir tu propia criptografía casera, solo usa lo que te han proporcionado las personas inteligentes.

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)

Active crypt() y bcrypt en postgresql en su 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

Utilice crypt() y gen_salt() en las consultas

Compare :pass con el 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 :password con una gran sal aleatoria:

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

Desde-en-Php bcrypt hash es ligeramente preferible

Hay password_* funciones en php 5.5 y superiores que permiten el hash de contraseñas trivialmente simple con bcrypt (¡ya era hora!), y hay una biblioteca de compatibilidad con versiones anteriores para versiones anteriores. Generalmente ese hashing se reduce a envolver una llamada al sistema 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+)

Tenga cuidado al iniciar sesión

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

En Resumen

Use php bcrypt si puede, disminuirá el tiempo que la contraseña permanece sin cifrar. Intente asegurarse de que su sistema Linux tenga bcrypt instalado en su crypt() por lo que es performante. Se recomienda enfáticamente actualizar al menos a php 5.3.7+, ya que la implementación de php tiene algunos errores de php 5.3.0 a 5.3.6.9, e inapropiadamente recurre al DES roto. sin previo aviso en php 5.2.9 y versiones anteriores.

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

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

  • http://codahale.com/how-to-safely-store-a-password/
  • http://www.postgresql.org/docs/9.2/static/pgcrypto.html
  • https://github.com/ircmaxell/password_compat