2017-03-16 199 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 

希望這可以幫助別人。