2017-04-07 1 views
0
내가 암호화하고 다음 코드를 사용하여 암호를 해독하려고

을 반환하지 않습니다敭 慖 畬 e. 나는 무엇을 놓치고ENCRYPTBYPASSPHRASE 및 DECRYPTBYPASSPHRASE는 올바른 값

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()으로 전달됩니다.

관련 문제