SQL加密仅返回第一个字符

时间:2016-07-03 09:41:59

标签: c# sql-server encryption

我有以下查询

UPDATE mytable 
SET col1 = ENCRYPTBYPASSPHRASE ('Key', col2) 
FROM mytable

当我使用

解密时
SELECT CONVERT(VARCHAR(20), DECRYPTBYPASSPHRASE ('Key', col1)) 
FROM mytable

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

3 个答案:

答案 0 :(得分:5)

col2可能是nvarchar而不是varchar。尝试

SELECT CONVERT(NVARCHAR(20), DECRYPTBYPASSPHRASE ('Key', col1)) 
FROM mytable

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

当你将它转换为varchar时,它被视为终止字符串的空字符。

答案 1 :(得分:1)

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

  • 如果您将SQL列的数据类型更改为varbinary,请确保在解密数据时使用相同的旧数据类型。也就是说,如果你有一个包含数据的varchar列然后你把它改成varbinary,你必须使用varchar解密它,如果使用nvarchar,你将得到垃圾数据。
  • 您必须使用相同的方式加密和解密。也就是说,如果您从存储过程加载密码并在加密中使用它,并且使用解密函数加载SAME EXACT密码,您也将获得垃圾数据(我测试了它但我不知道为什么会出现这种情况!)可能在内部,从SP和函数返回数据之间存在一些差异。

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

答案 2 :(得分:0)

CONVERT与您要加密更新的值的数据类型和大小一起使用。 看来EncryptByKey无法按照列模式正确识别数据。

尝试如下

ENCRYPTBYKEY(KEY_GUID('<Key Name>'), CONVERT(varchar(20),col1))