2017-03-16 203 views
0

一个存储过程AES加密我有一个SQL Server 2008中表类似于下面的结构:创建MS 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 [email protected] 

我的问题是,我怎么插加密/解密程序在这些SPs内部让他们工作?我已经看过几篇文章来达到这个目的,但我一直在讨论一个问题或另一个问题;主要是因为ntext数据类型。或者,也许我可能会在这里走错路。任何形式的帮助表示赞赏。 PS:由于DBA指定的某些原因,我无法将LongText的数据类型从ntext更改为nvarcharvarchar。因此,所有的铸件都应用在程序中。

+0

轻微的弯路... HTTP://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

+0

是上药你的DBA?坚持使用ntext没有任何理由。该数据类型已被弃用十多年,以支持nvarchar(max)。但我不太明白这里的问题。 –

+0

ypou将如何保护加密密钥?你抵御什么样的攻击? – zaph

回答

0

好吧,所以我设法说服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 

希望这可以帮助别人。