Procedimiento almacenado que primero coincide con una contraseña y luego la cambia

Tengo problemas para escribir un procedimiento almacenado que primero compara una contraseña cifrada con una contraseña proporcionada por el usuario (también cifrada). Si las contraseñas coinciden, el procedimiento cambiaría la contraseña a una nueva contraseña proporcionada por el usuario para que se convierta en hash antes de almacenarse. Lo intenté y aparecí con el siguiente código que parece estar completamente fuera de la sintaxis adecuada. Cualquier ayuda que se pueda proporcionar sería muy apreciada. El código en cuestión es el siguiente:

Create Proc UserChangePassword
    @pGuid varchar(50),
    @pOldPassword varchar(100),
    @pHashedPassword varchar (100),
    @pNewPassword varchar(10)
AS
        set @pHashedPassword = HASHBYTES('md5', @pOldPassword)
        set @pOldPassword as select st01Password from st01UserData where @pGuid = st01GUID
        If  ( @pOldPassword = @pHashedPassword)
    Begin
        Update st01UserData (
        set st01Password = HASHBYTES('md5', @pNewPassword))
        where st01GUID = @pGuid
        Return 'SUCCESS'
    Else
        RETURN 'FAILED'
GO

preguntado el 22 de mayo de 12 a las 20:05

¿Por qué el tamaño de la nueva contraseña es solo 10? Espero que ese no sea el límite del tamaño de la contraseña; permitir al menos 32 -

¿Por qué no estás pasando el valor hash? La aplicación debería poder codificar la entrada del usuario y enviarla en formato hash... No estoy seguro de por qué querrías exponerla en más capas en texto sin formato. -

1 Respuestas

Algunas razones detrás de sus problemas:

  • ¿Por qué su aplicación proporciona @pHashedPassword si simplemente lo configura ciegamente en algo como la primera línea de su procedimiento?
  • La sintaxis set @variable AS SELECT ... no es una sintaxis T-SQL válida.
  • Tus BEGIN no tiene una coincidencia END.
  • La sintaxis UPDATE table ( tampoco es valido.
  • Veo pocas razones para extraer la contraseña anterior en una variable, compararla fuera de la consulta y luego realizar una actualización, cuando puede hacer todo eso en un solo paso.
  • No puedes RETURN una cadena, sólo un INT.
  • ¿También es curioso que la contraseña anterior pueda tener 100 caracteres, pero la nueva contraseña solo 10?

Prueba esta versión:

CREATE PROCEDURE dbo.UserChangePassword
  @pGuid        VARCHAR(50),
  @pOldPassword VARCHAR(100),
  @pNewPassword VARCHAR(10)
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE dbo.st01UserData
    SET st01Password = HASHBYTES('md5', @pNewPassword)
    WHERE st01Guid = @pGuid
    AND st01Password = HASHBYTES('md5', @pOldPassword);

  IF @@ROWCOUNT = 0
    RETURN -1;

  RETURN 0;
END
GO 

contestado el 22 de mayo de 12 a las 20:05

+1 Pero es posible que desee agregar una advertencia de que md5 está roto y No debería ser usado para almacenar contraseñas. Como prueba, OP puede probar algunas contraseñas hash aquí y mira cuánto tiempo lleva resolverlos. - Lieven Keersmaekers

@Lieven Gracias, lo acabas de hacer. Supongo que el usuario no puede simplemente cambiar todas las contraseñas existentes para que no hayan sido cifradas a través de MD5. :-)- Aarón Bertrand

No es mi taza de té, pero si se rompe, podría recuperar las contraseñas de texto sin formato tan fácilmente como lo haría un atacante y usar otro método de cifrado para almacenarlas. Acabo de leer sobre eso esta mañana, ahora si tan solo pudiera recordar dónde... - Lieven Keersmaekers

@user1387329 - No creo que era la intencion de aaron . No dejes que te afecte, tú mejorarlo con el tiempo. - Lieven Keersmaekers

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.