2012-05-22 35 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

爲什麼NEWPASSWORD只有10的大小?我希望這不是密碼大小的限制;至少允許32 – Riking

+1

爲什麼你不通過哈希值?該應用程序應該能夠散列用戶輸入並以散列形式發送它...我不確定爲什麼要以純文本形式在更多圖層上公開它。 –

回答

6

一些原因背後的問題:

  • 爲什麼你的應用程序提供@pHashedPassword如果你只是一味地將它設置爲東西爲你的程序的第一線?
  • 語法set @variable AS SELECT ...是無效的T-SQL語法。
  • 您的BEGIN沒有匹配的END
  • 語法UPDATE table (也是無效的。
  • 我看不出有什麼理由將舊密碼拉入變量,在查詢之外進行比較,然後執行更新,以便在一個步驟中完成所有操作。
  • 你不能RETURN一個字符串,只有一個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

這不是我的一杯茶,但如果它壞了,他可以像攻擊者一樣容易地得到明文密碼,並使用另一種加密方法將其存回。我今天早上剛剛閱讀,現在如果我只記得在哪裏...