C# SQL加密仅返回第一个字符

C# SQL加密仅返回第一个字符,c#,sql-server,encryption,C#,Sql Server,Encryption,我有以下疑问 UPDATE mytable SET col1 = ENCRYPTBYPASSPHRASE ('Key', col2) FROM mytable 当我使用 SELECT CONVERT(VARCHAR(20), DECRYPTBYPASSPHRASE ('Key', col1)) FROM mytable 返回的结果仅为第一个字符,例如,如果字段包含“Computer”,则结果仅为“C”。col2可能是nvarchar而不是varchar。试一试 SELECT CONVE

我有以下疑问

UPDATE mytable 
SET col1 = ENCRYPTBYPASSPHRASE ('Key', col2) 
FROM mytable
当我使用

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

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

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

SELECT CONVERT(NVARCHAR(20), DECRYPTBYPASSPHRASE ('Key', col1)) 
FROM mytable
在nvarchar中,标准ASCII字母的代码点与ASCII相同,但用
0x00
字节填充


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

经过调查,我遇到了许多问题,因此我将发布我遇到的问题,以便任何人都能从中受益

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

希望这对任何人都有帮助

使用
CONVERT
加密更新的值的数据类型和大小。 看起来
EncryptByKey
无法根据列架构正确识别数据

尝试如下

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

的列
col1
是什么数据类型?列是varbinary(750)您是否尝试将其更改为
varbinary(MAX)
?只是为了测试生成的密码是否需要更多空间。您是否在某处调用函数,并且仅将参数定义为
VARCHAR
(没有明确定义VARCHAR的长度)?在这种情况下,参数的默认长度正好是1个字符,这通常不是您想要的长度-因此您应该始终为参数指定一个显式长度阅读:我解密时认为是字符串的密码给出的结果与问题作者的结果相同。(只是第一个字母)当我在加密之前先将密码转换为Varchar,然后解密时,它是正确的。所以是的,解密列或字符串必须是varchart对应的数据类型是我的问题:nvarchar到varchar