2011-02-17 12 views
6

Tengo dos sales, cada usuario tiene una sal única que se almacena con la información del usuario en la base de datos. La segunda sal es una que es específica del sitio web. Ambos son necesarios para hash las contraseñas.¿Dónde está el mejor lugar para guardar la contraseña del sitio web?

El problema es que no sé dónde debo guardar la sal de mi sitio web. En este momento, reside en el método PHP que ejecuta el algoritmo hash. ¿Debo guardarlo en un archivo fuera de/var/www/y abrir PHP y leer el archivo? No quiero almacenarlo en la base de datos porque eso vencería el propósito de tener dos sales en caso de que mi base de datos se vea comprometida.

¿Alguna sugerencia?

+0

Como una constante en un archivo config.php? – Jonah

Respuesta

11

¿Una opción no mencionada aún? Una variable ambiental servida por el servidor. Puede hacerlo en httpd.conf, o en .htaccess. Dado que Apache no sirve archivos .htaccess, usted no tiene que preocuparse acerca de cómo ocultar lo tanto ...

SetEnv WEBSITE_SALT 232lhsdfjaweufha32i4fv4239tauvkjn 

De esta forma, todo lo que tiene que hacer en su aplicación es $salt = getenv('WEBSITE_SALT');. El beneficio aquí es que es transparente para la aplicación ...

+1

¿Por qué no todos te votan? ¡Esto es genial! – Undo

+0

Puedo ver un problema aquí. En la mayoría de las aplicaciones, los usuarios tienen las mismas contraseñas, como "contraseña" o "letmein". Si genera un hash MD5 del mismo valor con la misma sal, se genera el mismo valor hash, lo que permite a un posible atacante detectar patrones y utilizar las contraseñas de los usuarios en la aplicación. me trataron de la misma sal con hashlib de pitón: (extraer más adelante) 'texto plano = 'Hola Mundo' sal = '232lhsdfjaweufha32i4fv4239tauvkjn' h1 = hashlib.md5 (sal + texto plano) .hexdigest() h2 = hashlib.md5 (sal + texto claro) .hexdigest() print h1 == h2 >> True' –

5

Sí, guárdelo en un archivo de configuración PHP en algún lugar, preferiblemente en una carpeta encima del directorio que es la raíz web.

0

Almacenar el sal del sitio web en un archivo que nunca se puede servir es su mejor opción aquí. No tiene sentido encriptar la sal, o mantenerla con los otros como usted señaló. Solo asegúrate de que el archivo en el que lo guardaste no se pueda servir si se solicita (fuera de la raíz www funciona) y asegúrate de que tenga los permisos adecuados establecidos.

0

Simplemente pégalo en una variable dentro de un archivo .php. Por un poco menor de mayor seguridad por la oscuridad, se puede almacenar en (por ejemplo) el formato codificado en base 64, y el nombre de la variable algo completamente inocuo, como

$this_is_not_the_salt_you_are_looking_for = base64_decode(.... encoded salt string here ...); 

para un bit extra-extra de seguridad, coloque el archivo .php en algún lugar fuera de la webroot, de modo que si por alguna razón la configuración del servidor web se agota y comienza a servir código PHP sin procesar, no se puede acceder directamente al archivo que contiene la información saliente.

-3

La mayoría de las personas almacenará una sal constante en un archivo de configuración. Esto está bien, pero el objetivo de usar SALT es garantizar que una fuente externa no pueda leer sus datos.

He visto mucha gente almacenar la sal en la base de datos en el campo de cuentas. Aquí está el giro, sin embargo. Se generó de manera única en la creación de la cuenta, por lo que cada usuario tiene una sal única.

No se trata de la sal sin embargo, se trata de cómo está encriptando los datos.

sha1($password.md5(md5($password.md5($salt)))) 

Incluso con la sal es probable que nunca sea capaz de descifrar esto. Así que no te preocupes por guardarlo en tu base de datos si decides ser único por cuenta. ¡Solo asegúrate de que tu proceso de encriptación sea fuerte!

+0

Primero, no alimente directamente la salida de una función hash a la entrada de otra. Eso no es bueno. En segundo lugar, simplemente haga un estiramiento normal en lugar de ese código de aspecto extraño. Ver [esta publicación] (http://stackoverflow.com/questions/4948322/fundamental-difference-between-hashing-and-encryption-algorithms/4948393#4948393) para más información ... ¡Y hash! = Cifrado. Hay una gran diferencia ... – ircmaxell

+0

también usando algoritmos matemáticos especiales su doble contraseña md5 hash puede ser de ingeniería inversa (especialmente porque MD5 ya no es seguro) – xorinzor

Cuestiones relacionadas