SQL AES_256 加密和解密

Jas*_* B. 1 security encryption sql-server-2016

我有一个奇怪的加密和解密问题。加密在 SQL 2008 R2 中运行良好,我们使用的是 TRIPLE_DES_3KEY。这在 SQL 2016 中已被弃用,因此我们正在测试 AES_256。我的原始字符串不断被切断,不确定它在做什么或如何解释。我确定我错过了一些东西,但不确定是什么。详情如下。谢谢!

我的对称密钥:

CREATE SYMMETRIC KEY SK03  
WITH  
    ALGORITHM = AES_256  
    ENCRYPTION BY PASSWORD = 'ThisIsMyAES_256EncryptionTest';  
Run Code Online (Sandbox Code Playgroud)

我的表:

CREATE TABLE [dbo].[_EncryptionTest](  
    [OriginalValue] [varchar](max) NULL,  
    [Encryptedvalue] [varbinary](8000) NULL  
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我的存储过程:

CREATE PROCEDURE [dbo].[_usp_EncryptionTest]  
    @InputString varchar(MAX),  
    @InputString2 varchar(MAX)  

AS  
BEGIN  
    SET NOCOUNT ON;  

    OPEN SYMMETRIC KEY SK03 DECRYPTION BY PASSWORD='ThisIsMyAES_256EncryptionTest'  

    INSERT INTO _EncryptionTest
        (OriginalValue, Encryptedvalue)
    VALUES (
        @InputString
        ,ENCRYPTBYKEY(Key_GUID('SK03'), CONVERT(VARBINARY,@InputString2))
        )

    CLOSE SYMMETRIC KEY SK03;

END  
Run Code Online (Sandbox Code Playgroud)

我的测试 SQL:

EXEC _usp_EncryptionTest 'Spring is Finally Here! Spring is Finally Here!','Spring is Finally Here! Spring is Finally Here!'
Run Code Online (Sandbox Code Playgroud)

如下图所示,数据已更新到我的表中。

在此处输入图片说明

我的解密 SQL:

OPEN SYMMETRIC KEY SK03 DECRYPTION BY PASSWORD='ThisIsMyAES_256EncryptionTest'  
SELECT   
    [OriginalValue]   
    ,CONVERT(varchar(MAX), DECRYPTBYKEY([EncryptedValue]))  
FROM  
    _EncryptionTest  
CLOSE SYMMETRIC KEY SK03;  
Run Code Online (Sandbox Code Playgroud)

下图应显示具有 decryoted 值截止值的结果。 在此处输入图片说明

Nic*_*Nic 5

尝试varbinary将转换语句中的长度定义为varbinary(max).Per https://technet.microsoft.com/en-us/library/ms188362(v=sql.110).aspx它将默认为 30。

您可以使用以下脚本复制它:

DECLARE @STRING VARCHAR(100);
SELECT  @STRING = REPLICATE('X', 100);

SELECT  LEN(@STRING) AS String_Length,
        LEN(CONVERT(VARBINARY, @STRING)) AS Varbinary_Length ,
        LEN(CONVERT(VARBINARY(MAX), @STRING)) AS VarbinaryMax_Length;
Run Code Online (Sandbox Code Playgroud)