SQL加密只返回第一个字符
本文关键字:第一个 字符 返回 加密 SQL | 更新日期: 2023-09-27 17:54:06
我有以下查询
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,你会得到垃圾数据。
- 必须使用相同的方式加密和解密。也就是说,如果你从存储过程中加载密码并使用它进行加密,并且使用函数加载相同的确切密码进行解密,你也会得到垃圾数据(我测试了它,但我不知道为什么是这种行为!)可能在内部有一些差异如何从SP和函数返回数据。
希望对大家有所帮助!
使用CONVERT
的数据类型和你正在加密更新的值的大小。看起来EncryptByKey
不能按列模式正确识别数据。
尝试如下
ENCRYPTBYKEY(KEY_GUID('<Key Name>'), CONVERT(varchar(20),col1))