2014-05-21 62 views
0

我試圖在SQL Server中創建一個簡單的存儲過程來使用密鑰加密數據。SQL Server中的加密存儲過程

我已經在數據庫中創建了一個主密鑰(UserMasterKey) &證書(UserMasterCert)。由於這是一次性任務,因此沒有包含在存儲過程中。

CREATE PROCEDURE [dbo].[AES_ENCRYPT] 
    @data VARBINARY, 
    @password NVARCHAR(10) 
AS 
    OPEN SYMMETRIC KEY UserMasterKey 
    DECRYPTION BY CERTIFICATE UserMasterCert WITH PASSWORD = @password; 
    DECLARE @encrypted NVARCHAR(50) = ENCRYPTBYKEY(KEY_GUID(N'UserMasterKey'), @data); 
    CLOSE SYMMETRIC KEY UserMasterKey; 
RETURN @encrypted 

,但我得到以下錯誤:

Incorrect syntax near @password SQL Fiddle Here

回答

0

有幾件事情錯了這個過程,我從來沒有使用證書,因爲我還記得我們曾經一個不對稱的加密對稱密鑰,就密鑰來加密對稱密鑰。

反正回來到您的程序

  1. 您還沒有提到你@Data變量任意長度就意味着默認情況下它被分配的1長度這是SQL Server的默認行爲。
  2. 您正在嘗試使用返回關鍵字從此過程返回一個字符串。 Sql Server只能使用RETURN關鍵字返回INT數據類型。要返回任何其他數據類型,您必須使用OUTPUT參數。
  3. 您正在嘗試將加密數據存儲到NVARCHAR變量時,此數據在加密時位於varbinary數據類型中。
  4. 您的輸入數據將是一些字符串varchar/Nvarchar,並輸出加密數據將是varbinary。

我建議的修復

CREATE PROCEDURE [dbo].[AES_ENCRYPT] 
    @data  NVARCHAR(50), 
    @password NVARCHAR(10), 
    @encrypted VARBINARY(4000) OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    OPEN SYMMETRIC KEY UserMasterKey 
    DECRYPTION BY CERTIFICATE UserMasterCert WITH PASSWORD = @password; 

    SET @encrypted = ENCRYPTBYKEY(KEY_GUID(N'UserMasterKey'), @data); 

    CLOSE SYMMETRIC KEY UserMasterKey; 
END 
+0

謝謝全面的信息,但我仍然遇到同樣的錯誤:'附近有語法錯誤@ password'' sqlfiddle這裏http://sqlfiddle.com/#!6/d41d8/17758 – Abhijeet

0

你得到的錯誤,因爲你需要指定長度的VARBINARY的說法,即VARBINARY(1000)或VARBINARY(MAX)。

+0

我試圖把VARBINARY( MAX)。它沒有修復錯誤:http://sqlfiddle.com/#!6/d41d8/17760 – Abhijeet

+0

沒有指定長度不是一個語法問題。 SQL Server將只使用默認長度,在這種情況下,它將是1。 –

0

除了所有的由@ M.Ali提到的問題在他們answer,手頭的問題(即錯誤「@Password附近有語法錯誤」)是最有可能的是,WITH PASSWORD =子句需要一個字符串和韓元不接受像你想要做的變量@password

如果你看看MSDN頁面OPEN SYMMETRIC KEY你將以下語法(節錄只顯示相關部分):

OPEN SYMMETRIC KEY Key_name DECRYPTION BY <decryption_mechanism> 

<decryption_mechanism> ::= 
    CERTIFICATE certificate_name [ WITH PASSWORD = 'password' ] 

你也許能夠得到解決通過動態SQL此限制。以下內容主要基於@ M.Ali提供的代碼(本頁中的某處;-),但適用於將主代碼放入Dynamic SQL中,以便它可以包含值@password作爲字符串文字並更改數據類型將輸入參數設置爲VARBINARY(MAX)以與問題中提供的原始代碼更加一致。

CREATE PROCEDURE [dbo].[AES_ENCRYPT] 
(
    @data  VARBINARY(8000), 
    @password NVARCHAR(10), 
    @encrypted VARBINARY(8000) OUTPUT 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @SQL NVARCHAR(MAX); 

    SET @SQL = N' 
    OPEN SYMMETRIC KEY UserMasterKey 
    DECRYPTION BY CERTIFICATE UserMasterCert WITH PASSWORD = ''' 
     + @password 
     + N'''; 

    SET @TempEncrypted = ENCRYPTBYKEY(KEY_GUID(N''UserMasterKey''), @TempData); 

    CLOSE SYMMETRIC KEY UserMasterKey; 
    '; 

    EXEC dbo.sp_executesql 
      @SQL, 
      N'@TempData VARBINARY(8000), @TempEncrypted VARBINARY(8000) OUTPUT', 
      @TempData = @data, 
      @TempEncrypted = @encrypted OUTPUT; 

END