sql >> Base de Datos >  >> RDS >> Mysql

MYSQL:Procedimiento con sentencia if

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 :-)