2017-04-07 66 views
0

我試圖加密,並使用下面的代碼解密:ENCRYPTBYPASSPHRASE和DECRYPTBYPASSPHRASE沒有返回正確的價值觀

declare @decryptedValue nvarchar(4000) 
declare @encryptedValue varbinary(8000) 

SET @encryptedValue = ENCRYPTBYPASSPHRASE('SQL SERVER 2008','SomeValue') 
Set @decryptedValue = DECRYPTBYPASSPHRASE('SQL SERVER 2008',@encryptedValue) 

print @decryptedValue 

但解密的價值是不是我在(「someValue中」)通過,但一些加密的性格特徵潓敭慖畲即

奇怪的是,如果我創建了兩個功能,如它下面的工作:

CREATE FUNCTION dbo.Encrypt(@str nvarchar(4000)) 
    RETURNS varbinary(8000) 
    AS BEGIN 
    DECLARE @res varbinary(8000) 
    SET @res = ENCRYPTBYPASSPHRASE('SQL SERVER 2008',@str) 
    RETURN (@res) 
    END 
    GO 



    CREATE FUNCTION dbo.Decrypt(@encrypt varbinary(8000)) 
    RETURNS nvarchar(4000) 
    AS 
    BEGIN 
    DECLARE @res nvarchar(4000) 
    SET @res = DECRYPTBYPASSPHRASE('SQL SERVER 2008',@encrypt) 
    RETURN(@res) 
    END 
    GO 


declare @x nvarchar(4000) 
declare @code varbinary(8000) 
SET @code = dbo.Encrypt('SomeValue') 
Print @code 
set @x = dbo.Decrypt(@code) 
print @x 

我缺少什麼?

+0

問題是與nvarchar,如果將其更改爲varchat它工作正常 – Simsons

回答

2

問題是,您正在加密varchar值並將解密後的值轉換爲nvarchar。這兩種數據類型具有不同的字節結構。它很容易固定,雖然(從字面上一個字符):

declare @decryptedValue nvarchar(4000) 
declare @encryptedValue varbinary(8000) 

SET @encryptedValue = ENCRYPTBYPASSPHRASE('SQL SERVER 2008',N'SomeValue') --note the "N" before "N'SomeValue'" 
Set @decryptedValue = DECRYPTBYPASSPHRASE('SQL SERVER 2008',@encryptedValue) 

print @decryptedValue 

至於爲什麼它與你的工作職能,因爲函數的參數被輸入自己,你得到的隱式轉換。因此,當您向Encrypt函數提供'SomeValue'時,它將轉換爲該函數的nvarchar版本,並且傳遞給encryptbypassphrase()