ENCRYPTBYPASSPHRASE 和 DECRYPTBYPASSPHRASE 未返回正确的值
ENCRYPTBYPASSPHRASE and DECRYPTBYPASSPHRASE is not returning correct values
我正在尝试使用以下代码加密和解密:
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'),而是一些加密字符潓敭慖疏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
我错过了什么?
问题是您正在加密 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()
。
我正在尝试使用以下代码加密和解密:
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'),而是一些加密字符潓敭慖疏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
我错过了什么?
问题是您正在加密 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()
。