2011-09-16 7 views
5

Estoy aprendiendo MySQL y PHP a través de un libro en la biblioteca. Estaba mejorando la seguridad del sistema de cifrado de la contraseña cambiando el almacenamiento de contraseñas deRetraso posible al usar NOW() en MySQL Query?

password=SHA('password') 

a

password=SHA(CONCAT('password', '--', registration_date)) 

donde registration_date es la marca de tiempo cuando el usuario registrado.

El código actual para los usuarios registrarse es:

INSERT INTO users (first_name, last_name, email, password, registration_date) 
VALUES ('first_name', 'last_name', 'email', SHA(CONCAT('password', '--', NOW())), NOW()); 

Voy a tener que preocuparse por las dos funciones diferentes ahora() en allí? ¿Existe la posibilidad de que tengan momentos ligeramente diferentes? Lo intenté con un par de consultas y pareció funcionar bien.

Si hay un problema, ¿cómo lo arreglaría?

+0

Será mejor, muy, muy, muy, muy, muy, muy seguro de que el campo registration_date nunca, nunca, nunca, nunca se actualice. De lo contrario, se encontrará con una escasez repentina de usuarios. –

+0

@Larry: eso se aplicaría también al campo de contraseña. :) –

Respuesta

3

No hay problema. Desde manual:

NOW() devuelve un tiempo constante que indica la hora a la que la instrucción comenzó a ejecutarse. (Dentro de una función almacenado o desencadenador, NOW() devuelve la hora en que la declaración de función o activación comenzó a ejecutar.)

Como muestra manuales por ejemplo, cada evaluación de NOW() dentro de una sentencia devuelve el mismo valor , independientemente de cuánto tiempo haya pasado entre las evaluaciones.

0

En un servidor, no tiene que preocuparse. De la documentación:

NOW() devuelve un tiempo constante que indica la hora en que la instrucción comenzó a ejecutarse.

(http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_now) Así que el valor no cambiará en una consulta.

Sin embargo, debe tener cuidado con la replicación basada en enunciados. Si existe la posibilidad de que su base de datos se replique de esta manera (por ejemplo, para copias de seguridad, o HA), entonces el esclavo puede tener un NOW() diferente del maestro.

+0

Buen punto sobre SBR. Maestro y esclavo pueden tener diferentes valores 'NOW()'. Pero los valores de 'NOW()' en una fila del esclavo serán los mismos _en esa fila_. (Creo que esto es lo que le preocupa a OP). Si las diferencias entre los valores maestros y esclavos 'NOW()' son un problema, entonces la replicación basada en filas corrige eso. Alternativamente, uno podría quizás jugar juegos con 'SET TIMESTAMP' (que afecta el valor de' NOW() ') para evitar el problema. –