ENCRYPTBYPASSPHRASE和DECRYPTBYPASSPHRASE未返回正确的值

Sim*_*ons 1 sql-server encryption password-encryption

我正在尝试使用以下代码进行加密和解密:

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

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

print @decryptedValue
Run Code Online (Sandbox Code Playgroud)

但解密的值不是我传入的('SomeValue'),而是一些加密的字符潓敭畲e e e.

奇怪的是,如果我创建两个函数,如下所示它的工作原理:

 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
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Ben*_*hul 9

问题是您正在加密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
Run Code Online (Sandbox Code Playgroud)

至于为什么它与你的函数一起工作,因为函数的参数本身是键入的,你得到一个隐式转换.所以,当你提供'SomeValue'Encrypt功能,它被转换为那一个nvarchar版本,传递给encryptbypassphrase().