2017-04-26 60 views
0

因此,我正在編寫一些tsql的程序以使組項目恢復原狀,並且正在嘗試編寫一些內容來創建帶有密碼的用戶配置文件。但是,當我運行這段代碼時,@ seedno和@saltval的值永遠不會被設置,所以我的散列密碼最終以null值結束。有沒有人可以幫忙?此代碼未設置某些值

CREATE PROCEDURE [dbo].[CreateCustomerAccount] 
    @companyName nvarchar (50), 
    @emailAddress nvarchar(50), 
    @password nvarchar (100), 
    @Addr1 nvarchar (50), 
    @Addr2 nvarchar (50), 
    @Addr3 nvarchar (50), 
    @postCode nvarchar (11), 
    @Telephone NVARCHAR (20), 
    @vatNo NVARCHAR (20) 

AS 
    SET NOCOUNT ON 

    --Declare some variables here 
    DECLARE  
     @pwdSalt NVARCHAR (25), 
     @Seed INT,         /* this is going to store the randomly generated seed we will use to make the salt */ 
     @CurrentChar CHAR, 
     @SaltedPwd NVARCHAR (125), 
     @LoopCountVar TINYINT,      /*because counting is fun, kids :). */ 
     @Seedno integer, 
     @saltval CHAR 




     --Generate a seed using the customers email address and a psuedo random number generator. 

     SET @LoopCountVar = 0; 

     WHILE @LoopCountVar <= LEN(@emailAddress) 
      BEGIN 
       SET @CurrentChar = SUBSTRING(@EmailAddress, @LoopCountVar, 1) 

       SET @Seedno = (ASCII(@currentChar)*CRYPT_GEN_RANDOM(10000)) 

       SET @Seed = @Seed + @Seedno --Add the integer value of the current character multiplied by a random number between 0 and 100,000 to the seed 

       SET @LoopCountVar = @LoopCountVar+1 

      END; 

    --Now, populate our salt string by inserting random characters using the seed we just created. 
    SET @LoopCountVar = 0; 

    while @loopCountVar <= 25 
    BEGIN 
     SET @saltval = CHAR (ROUND((RAND()*94)+32,3)) 
     SET @pwdSalt = @pwdSalt + @saltval 
     SET @LoopCountVar = @LoopCountVar+1 
    END; 

    --Time for delicious delicious salted hash 
    Set @SaltedPwd = @[email protected]; 

    -- Insert data into table 
    Insert into Customer (orgName, Email, AccountPwd, PwdSalt, AddressLine1, AddressLine2, AddressLine3, PostCode, TelephoneNo, VATNo) 
    VALUES (@companyName, @emailAddress, HASHBYTES('MD5', @SaltedPwd), @pwdSalt, @Addr1, @Addr2, @Addr3, @postCode, @Telephone, @vatNo); 
RETURN 0 

回答

0

這似乎是一個非常迂迴的方式來生成pwd。 反正在你的第二個循環中,您使用的是未賦值的變量,這使結果無效

試試這個:

SET @LoopCountVar = 0; 
SET @pwdSalt='' 
while @loopCountVar <= 25 
BEGIN 
    SET @saltval = CHAR (ROUND((RAND()*94)+32,3)) 
    SET @pwdSalt = @pwdSalt + @saltval 
    SET @LoopCountVar = @LoopCountVar+1 
END; 
0

你有幾件事情要解決。 首先,您試圖將ASCII()函數的返回值(INT)與VARBINARY(80)相乘,後者是CRYPT_GEN_RANDOM()函數的返回類型。

其次,您調用的參數長度大於8000的CRYPT_GEN_RANDOM(10000),這是您可以在此函數中使用的最大長度。

看看thisthis的鏈接。 通常,在進行任何計算之前,您可以逐步調試您的存儲過程主體,以選擇其中的變量值。

+0

那麼由於一點也沒有使用的種子,第一循環似乎是白費力氣呢。 –

+0

那很好,當前版本在第二個循環中使用@seed。我在某一點上忘了它。我將行改爲 SET @Seedno =(ASCII(@currentChar)* CAST(CRYPT_GEN_RANDOM(2)AS INT))' –

+0

...並且它投擲了 消息8152,級別16,狀態13,過程CreateCustomerAccount, 62行 字符串或二進制數據將被截斷。 該聲明已被終止。 對不起有關二重柱。我以前沒有用過這個,我正在努力去適應它。 –

相關問題