【问题标题】:Create a Stored Procedure for AES Encryption in MS SQL Server 2008在 MS SQL Server 2008 中为 AES 加密创建存储过程
【发布时间】:2017-08-08 01:03:01
【问题描述】:

我有一个 SQL Server 2008 表,其结构类似于以下内容:

ID int PRIMARY KEY IDENTITY(1,1)
Name nvarchar(100)
LongText ntext

我想要实现的目标很简单。在此表中插入数据之前,我想使用 AES_192 算法加密 LongText。我正在使用以下 SP 加密数据:

create proc sp_Encrypt_LongText
@rawText ntext = null,
@encryptedText nvarchar(max) output
as
begin
OPEN SYMMETRIC KEY Encryption_Symmetric_Key
DECRYPTION BY CERTIFICATE Encryption_Certificate WITH PASSWORD = 'mypassword'
set @encryptedText = ENCRYPTBYKEY(KEY_GUID(N'Encryption_Symmetric_Key'), cast(@rawText as nvarchar(max)))
CLOSE SYMMETRIC KEY Encryption_Symmetric_Key    
end

为了解密,我创建了以下 SP:

alter proc sp_Decrypt_LongText
@encryptedText ntext = null,
@decryptedText varchar(max) output
as
begin
    OPEN SYMMETRIC KEY Encryption_Symmetric_Key
    DECRYPTION BY CERTIFICATE Encryption_Certificate WITH PASSWORD = 'mypassword'
    set @decryptedText = cast(DECRYPTBYKEY(cast(@encryptedText as nvarchar(max))) as varchar(max))
    CLOSE SYMMETRIC KEY Encryption_Symmetric_Key
end

当我使用 exec 命令时,这些程序似乎运行良好。到目前为止,一切都很好。问题是使用存储过程在表中插入和获取数据;一个用于插入和选择。我目前的情况如下:

插入:

create proc sp_InsertData
@Name nvarchar(100),
@LongText ntext = NULL
as
INSERT INTO TABLE tbl VALUES (@Name, @LongText)

用于获取

create proc sp_FindDataById
@Id int
as
SELECT ID, Name, LongText from tbl where ID=@Id

我的问题是,如何在这些 SP 中插入加密/解密程序以使其工作?我已经查看了几篇文章来实现这一点,但我一直遇到一个或另一个问题;主要是因为ntext 数据类型。或者我可能在这里走错了路。任何形式的帮助表示赞赏。

PS:由于DBA指定的一些原因,我无法将LongText的数据类型从ntext更改为nvarcharvarchar。因此,所有的铸造都应用在程序中。

【问题讨论】:

  • 您的 DBA 是否吸毒?坚持使用 ntext 的正当理由为零。该数据类型已被弃用十多年,取而代之的是 nvarchar(max)。但我不太明白这里有什么问题。
  • 您将如何保护加密密钥?你要防御什么样的攻击?
  • @SeanLange 我一直在想同样的事情。我问了,我得到的答复与由于更改数据类型而受到影响的其他过程和对象有关。我不确定那是多么真实,但这就是我所坚持的。这里的问题是我想创建一个简单的过程来加密/解密 ntext,同时分别插入/获取行。我提供的代码就是我现在所拥有的。
  • @zaph 数据并不是那么敏感。此外,问题不完全在于加密本身,而在于如何模块化加密机制以在整个数据库中重用。在这种情况下,我试图重用它来插入和获取记录。

标签: sql-server sql-server-2008 stored-procedures encryption aes


【解决方案1】:

好的,所以我设法说服 DBA 将数据传输到具有 varbinary(max) 数据类型的新列。然后我在加密后将值转移到这个新列中,然后删除旧列并将新列重命名为旧列。做了一些工作,但现在一切都很顺利。我设法创建了一个存储过程和两个函数来进一步模块化脚本。

用于打开对称密钥

CREATE PROCEDURE sp_OpenEncryptionKeys  
AS  
BEGIN  
    SET NOCOUNT ON;  

    BEGIN TRY  
        OPEN SYMMETRIC KEY Encryption_Symmetric_Key  
        DECRYPTION BY CERTIFICATE Encryption_Certificate 
    END TRY  
    BEGIN CATCH  
        --catch
    END CATCH  
END

用于加密:

CREATE FUNCTION Encrypt
(  
    @ValueToEncrypt varchar(max)  
)  
RETURNS varbinary(max)  
AS  
BEGIN  
    -- Declare the return variable here  
    DECLARE @Result varbinary(max)  
    SET @Result = EncryptByKey(Key_GUID('My_Encryption_Symmetric_Key'), @ValueToEncrypt)  
    -- Return the result of the function  
    RETURN @Result  
END

用于解密:

CREATE FUNCTION Decrypt
(  
    @ValueToDecrypt varbinary(max)  
)  
RETURNS varchar(max)  
AS  
BEGIN  
    -- Declare the return variable here  
    DECLARE @Result varchar(max)  
    SET @Result = DecryptByKey(@ValueToDecrypt)  
    -- Return the result of the function  
    RETURN @Result  
END

用于插入

exec sp_OpenEncryptionKeys  
INSERT INTO tbl VALUES ('Name', Encrypt('some text here'))

用于获取

exec sp_OpenEncryptionKeys  
SELECT ID, Decrypt(LongText) from tbl

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多