Procedimiento almacenado que primero coincide con una contraseña y luego la cambia
Frecuentes
Visto 6,256 veces
3
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
1 Respuestas
6
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 coincidenciaEND
. - 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 unINT
. - ¿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ú sí mejorarlo con el tiempo. - Lieven Keersmaekers
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas sql-server sql-server-2008 tsql or haz tu propia pregunta.
¿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 - Riking
¿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. - Aaron Bertrand