SQL加密仅返回第一个字符

3 c# sql-server encryption

我有以下查询

UPDATE mytable 
SET col1 = ENCRYPTBYPASSPHRASE ('Key', col2) 
FROM mytable
Run Code Online (Sandbox Code Playgroud)

当我使用解密

SELECT CONVERT(VARCHAR(20), DECRYPTBYPASSPHRASE ('Key', col1)) 
FROM mytable
Run Code Online (Sandbox Code Playgroud)

返回的结果仅是第一个字符,例如,如果该字段包含“ Computer”,则结果仅为“ C”。

Mar*_*ith 6

col2大概是nvarchar而不是varchar。尝试

SELECT CONVERT(NVARCHAR(20), DECRYPTBYPASSPHRASE ('Key', col1)) 
FROM mytable
Run Code Online (Sandbox Code Playgroud)

在nvarchar中,标准ASCII字母的代码点与ASCII相同,但用0x00字节填充。

当您将其强制转换为varchar时,它将被视为终止字符串的空字符。


小智 5

经过调查,我遇到了很多问题,所以我会发布我遇到的问题,这样任何人都可以从中受益。

  • 如果将 SQL 列的数据类型更改为 varbinary,请确保在解密数据时使用相同的旧数据类型。也就是说,如果您有一列包含数据的 varchar ,然后将其更改为 varbinary,则必须使用 varchar 对其进行解密,如果使用 nvarchar ,则会得到垃圾数据。
  • 您必须使用相同的方式加密和解密。也就是说,如果您从存储过程加载密码并将其用于加密,并且使用解密函数加载相同的确切密码,您也会得到垃圾数据(我测试过,但我不知道为什么会这样!)可能在内部,从 SP 和函数返回数据的方式存在一些差异。

希望这可以帮助那里的任何人!