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"。

SQL加密只返回第一个字符

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))