2012-05-22 2 views
3

У меня возникла проблема с записью хранимой процедуры, которая сначала проверяет хешированный пароль на пароль, предоставленный пользователем (также хешированный). Если пароли совпадают, процедура изменит пароль на новый пароль, который будет предоставлен пользователем для хэширования перед сохранением. Я взял на него удар и включил код ниже, который кажется полностью вне правильного синтаксиса. Любая помощь, которая может быть поставлена, будет очень оценена. Код в вопросе ниже:Сохраненная процедура, которая сначала соответствует паролю, а затем меняет его

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 
+0

Почему размер Новый_пароль только 10? Я надеюсь, что это не предел размера пароля; позвольте по крайней мере 32 – Riking

+1

Почему вы не проходите в хешировании? Приложение должно иметь возможность хешировать ввод пользователя и отправлять его в хеширование ... Я не уверен, почему вы хотите разоблачить его через большее количество слоев в виде обычного текста. –

ответ

6

Некоторые причины за ваши проблемы:

  • Почему ваше приложение обеспечивая @pHashedPassword, если вы просто слепо установить его на что-то в первой строке вашей процедуры?
  • Синтаксис set @variable AS SELECT ... недействителен. Синтаксис T-SQL.
  • BEGIN не соответствует END.
  • Синтаксис UPDATE table ( также не действителен.
  • Я вижу небольшую причину, чтобы вытащить старый пароль в переменную, сравнить его за пределами запроса, а затем выполнить обновление, когда вы можете сделать все это за один шаг.
  • Вы не можете RETURN a строка, только INT.
  • Также любопытно, что старый пароль может быть 100 символов, но новый пароль только 10?

Попробуйте эту версию:

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 
+0

+1 Но вы можете добавить предупреждение о том, что ['md5' нарушен] (http://en.wikipedia.org/wiki/MD5) и ** не должны использоваться ** для хранения паролей. В качестве теста OP может опробовать некоторые хешированные пароли [здесь] (http://md5hack.com/) и посмотреть, сколько времени потребуется, чтобы разрешить их. –

+1

@ Lieven Спасибо, ты только что сделал. Я предполагаю, что пользователь не может просто изменить все существующие пароли, которые не были хэшированы через MD5. :-) –

+0

Это не моя чашка чая, но если она сломана, он может получить пароли открытого текста так же легко, как это сделал злоумышленник, и использовать другой метод шифрования для их хранения. Я просто прочитал об этом сегодня утром, теперь, если бы я только мог вспомнить, где ...

Смежные вопросы