Realmente debería codificar esas contraseñas, use el siguiente código
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `change_pass`(
in_Email VARCHAR(45),
in_PassOld VARCHAR(45),
in_PassNew VARCHAR(45)
)
BEGIN
DECLARE KnowsOldPassword INTEGER;
SELECT count(*) INTO KnowsOldPassword
FROM User
WHERE Email = in_Email AND passhash = SHA2(CONCAT(salt, in_PassOld),512);
IF (KnowsOldPassword > 0) THEN
UPDATE User
SET Passhash = SHA2(CONCAT(salt, inPassNew),512)
WHERE Email = in_Email;
END IF;
END $$
DELIMITER ;
La salt
es un campo adicional en la tabla user
eso es más o menos aleatorio, pero no necesita ser secreto. Sirve para derrotar a las tablas arcoiris
.
Puede establecer sal en una cadena corta char(10) o datos aleatorios. p.ej.
salt = ROUND(RAND(unix_timestamp(now())*9999999999);
No necesita actualizar la sal, solo genere una vez y luego guárdela.
Para obtener más información sobre este problema, consulte:
Salar mis hashes con PHP y MySQL
¿Cómo debo abordar éticamente el almacenamiento de contraseñas de usuario para su posterior recuperación de texto sin formato?
Un comentario sobre tu código
IF(@PassOld == in_PassOld) THEN //incorrect
IF(@PassOld = in_PassOld) THEN //correct, SQL <> PHP :-)