[asp.net]SQL 服务器解密替代字符是 (char) 0

标签: Asp.net SQLServer
发布时间: 2017/3/26 1:21:27
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个 web 应用程序,当我解密交替作为字符显示的数据加密在 SQL Server 中的数据:,(char) 0 或 \0 (取决于你怎么看)

如果我只是加密/解密数据库中它所有的作品。

示例︰

SELECT DecryptByKey(Value) FROM Table WHERE TableID=0

Returns: 0x5400450053005400
Should Return: 0x54455354

它添加 00 交替字符,并不能转换为 VARCHAR

DECLARE @T1 VARCHAR(10);SET @T1='TEST';
DECLARE @T2 VARBINARY(MAX); SET @T2 = ENCRYPTBYKEY(Key_GUID('Test_Key'), @T1);
SELECT DecryptByKey(@T2)

Returns: 0x54455354

正确地返回二进制的数组,并可以将转换为 VARCHAR

我创建证书/密钥这样︰

CREATE CERTIFICATE Test_Cert
ENCRYPTION BY PASSWORD = '***************'
WITH SUBJECT = 'TEST CERT',
EXPIRY_DATE = '20160202';
GO

CREATE SYMMETRIC KEY Test_Key
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE Test_Cert
GO

在 IIS 应用程序池设置为允许 32 位应用程序,因为它也能访问 Oracle 服务器 dll 都需要它。

解决方法 1:

您输入的值是 NVARCHAR() 值。NVARCHAR() 在每两个字节存储字符。要使文本解密后再一次,可读,只需将其转换回 NVARCHAR() 即可︰

SQL 小提琴

查询 1:

DECLARE @in NVARCHAR(100) = 'A test';
DECLARE @ciph VARBINARY(100) = ENCRYPTBYPASSPHRASE('APassPhrase!',@in);

SELECT @in [@in], CONVERT(VARCHAR(MAX),@ciph,1) [@ciph],
       CONVERT(VARCHAR(MAX),DECRYPTBYPASSPHRASE('APassPhrase!',@ciph),1) [DECRYPTBYPASSPHRASE],
       CAST(DECRYPTBYPASSPHRASE('APassPhrase!',@ciph) AS NVARCHAR(100)) [out];

结果

|    @in |                                                                      @ciph |        DECRYPTBYPASSPHRASE |    out |
|--------|----------------------------------------------------------------------------|----------------------------|--------|
| A test | 0x010000000CC6E5C9F1BC1B4C0B964DEF53F9F18B5AB8AD3D68AC4595A812E054C301187F | 0x410020007400650073007400 | A test |

注 1:

我的示例使用 ENCRYPTBYPASSPHARSE 而不是 ENCRYPTBYKEY ,但这个想法是相同的。

注 2:

为了让我不得不加 varbinary 字符串转换为正确显示 varbinary 值在 SQLFiddle 工作的例子︰ CONVERT(VARCHAR(MAX), ...,1)

在 SSMS,你就可以使用以下语句︰

查询 2:

DECLARE @in NVARCHAR(100) = 'A test';
DECLARE @ciph VARBINARY(100) = ENCRYPTBYPASSPHRASE('APassPhrase!',@in);

SELECT @in [@in], @ciph [@ciph],
       DECRYPTBYPASSPHRASE('APassPhrase!',@ciph) [DECRYPTBYPASSPHRASE],
       CAST(DECRYPTBYPASSPHRASE('APassPhrase!',@ciph) AS NVARCHAR(100)) [out];

注 3:

如果您的数据是永远不会要求 unicode 字符,因此可以或者在加密前将字符串转换为 VARCHAR。这也将节省大量的存储空间︰

查询 3:

DECLARE @in NVARCHAR(100) = 'A test';
DECLARE @ciph VARBINARY(100) = ENCRYPTBYPASSPHRASE('APassPhrase!',CAST(@in AS VARCHAR(100)));

SELECT @in [@in], @ciph [@ciph],
       DECRYPTBYPASSPHRASE('APassPhrase!',@ciph) [DECRYPTBYPASSPHRASE],
       CAST(DECRYPTBYPASSPHRASE('APassPhrase!',@ciph) AS VARCHAR(100)) [out];
官方微信
官方QQ群
31647020