【问题标题】:SQL Server Decrypt Alternate characters are (char)0SQL Server 解密备用字符为 (char)0
【发布时间】:2016-04-20 07:05:32
【问题描述】:

我有一个在 SQL Server 中加密数据的网络应用程序,当我解密数据时,交替字符显示为:�、(char)0 或 \0(取决于您如何看待它)

如果我只是在数据库中加密/解密,那么一切正常。

例子:

SELECT DecryptByKey(Value) FROM Table WHERE TableID=0

Returns: 0x5400450053005400
Should Return: 0x54455354

它在交替字符中添加00,并且不能CONVERT to 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

正确返回二进制数组,并且可以CONVERT to 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 需要它。

【问题讨论】:

    标签: asp.net sql-server encryption


    【解决方案1】:

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

    SQL Fiddle

    查询 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];
    

    Results

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

    注1

    我的例子是使用ENCRYPTBYPASSPHARSE而不是ENCRYPTBYKEY,但是思路是一样的。

    注2

    为了使示例在 SQLFiddle 中运行,我必须添加 varbinary 到字符串的转换以正确显示 varbinary 值: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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2018-08-10
      • 2014-03-08
      • 2021-02-18
      • 2012-06-12
      • 2010-12-30
      相关资源
      最近更新 更多