SQL Server 2008中的代碼安全(六) 對稱密鑰加密_Mssql數據庫教程

      編輯Tag賺U幣

      推薦:SQLServer 2008中的代碼安全(七) 證書加密
      證書可以在數據庫中加密和解密數據。證書包含密鑰對、關于證書擁有者的信息、證書可用的開始和結束過期日期。

      證書和非對稱密鑰使用數據庫級的內部公鑰加密數據,并且使用數據庫級內部私鑰解密數據。而對稱密鑰相對簡單,它們包含一個同時用來加密和解密的密鑰。困此,使用對稱密鑰加密數據更快,并且用在大數據時更加合適。盡管復雜度是考慮使用它的因素,但它仍然是一個很好的加密數據的選擇。

      我們看一組例子:

      示例一、創建對稱密鑰

      對稱密鑰的特性是:在數據庫會話中使用它對數據進行加密和解密前必須首先打開。

      創建對稱密鑰使用如下命令:CREATE SYMMETRIC KEY 創建對稱密鑰。()

      復制代碼 代碼如下:www.wf0088.com

      use DB_Encrypt_Demo
      go

      -- 創建一個用于加密對稱密鑰的非對稱密鑰
      CREATE ASYMMETRIC KEY symDemoKey --名稱
      WITH ALGORITHM = RSA_512 --加密算法
      ENCRYPTION BY PASSWORD = 'TestSYM456!'--密碼

      -- 創建一個對稱密鑰
      CREATE SYMMETRIC KEY sym_Demo
      WITH ALGORITHM = TRIPLE_DES
      ENCRYPTION BY ASYMMETRIC KEY symDemoKey

      示例二、查看當前數據庫中的對稱密鑰

      使用目錄視圖sys.symmetric_keys()來查看。

      復制代碼 代碼如下:www.wf0088.com

      --查看當前數據庫中的非對稱密鑰
      use DB_Encrypt_Demo
      go
      SELECT name, algorithm_desc FROM sys.symmetric_keys
      ----結果返回
      /*
      name algorithm_desc
      sym_Demo TRIPLE_DES
      */

      示例三、修改非對稱密鑰的加密方式

      你可以使用ALTER SYMMETRIC KEY()命令修改對稱密鑰的加密方式。但執行前必須使用OPEN SYMMETRIC KEY()命令打開它。

      復制代碼 代碼如下:www.wf0088.com

      use DB_Encrypt_Demo
      go

      --先用私鑰密碼打開對稱密鑰
      OPEN SYMMETRIC KEY sym_Demo
      DECRYPTION BY ASYMMETRIC KEY symDemoKey
      WITH PASSWORD = 'TestSYM456!'

      --打開之后,先增加密碼加密,取代原密鑰
      ALTER SYMMETRIC KEY sym_Demo
      ADD ENCRYPTION BY PASSWORD = 'newnew!456'
      --再刪除非對稱密鑰加密
      ALTER SYMMETRIC KEY sym_Demo
      DROP ENCRYPTION BY ASYMMETRIC KEY symDemoKey
      --完成操作后,關閉對稱密鑰
      CLOSE SYMMETRIC KEY sym_Demo

      示例四、使用對稱密鑰對數據進行加密和解密。

      1、為了使用對稱密鑰對數據進行加密,必須首先打開它,然后使用函數EncryptByKey 加密數據。()

      2、使用DecryptByKey來解密使用對稱密鑰加密的數據。注意DecryptByKey不像甩EncryptByKey,無須使用對稱密鑰GUID。因此,為了解密,必須打開正確的對稱密鑰會話,否則會顯示null。

      下面是一個例子:

      復制代碼 代碼如下:www.wf0088.com

      /****************************3w@live.cn***********************/
      USE DB_Encrypt_Demo
      GO
      --創建測試數據表,用于對稱加密
      CREATE TABLE dbo.PWDQuestion
      (CustomerID int NOT NULL PRIMARY KEY,
      PasswordHintQuestion nvarchar(300) NOT NULL,
      PasswordHintAnswer varbinary(200) NOT NULL)
      GO
      --插入加密數據
      OPEN SYMMETRIC KEY sym_Demo
      DECRYPTION BY PASSWORD = 'newnew!456'
      INSERT dbo.PWDQuestion
      (CustomerID, PasswordHintQuestion, PasswordHintAnswer)
      VALUES
      (12, '您出生的醫院名稱?',
      EncryptByKey(Key_GUID('sym_Demo '), '杭州市一'))
      CLOSE SYMMETRIC KEY sym_Demo

      查看未加密的數據:
      復制代碼 代碼如下:www.wf0088.com

      --解密數據
      OPEN SYMMETRIC KEY sym_Demo
      DECRYPTION BY PASSWORD = 'newnew!456'
      SELECT CustomerID,PasswordHintQuestion,
      CAST(DecryptByKey(PasswordHintAnswer) as varchar(200)) PasswordHintAnswer
      FROM dbo.PWDQuestion
      WHERE CustomerID = 12
      --打開后切記關閉!!!3w@live.cn
      CLOSE SYMMETRIC KEY sym_Demo

      邀月工作室

      復制代碼 代碼如下:www.wf0088.com

      --不打開直接讀取
      SELECT CustomerID,PasswordHintQuestion,
      CAST(DecryptByKey(PasswordHintAnswer) as varchar(200)) PasswordHintAnswer
      FROM dbo.PWDQuestion
      WHERE CustomerID = 12

      邀月工作室

      至此,好像已經大功告成了,別,千萬別高興得太早!

      這里有個問題,如果惡意用戶不知道CustomerID=13的PasswordHintAnswer列的真實值,但知道CustomerID=14的PasswordHintAnswer列的真實值,則完全可以通過惡意替換PasswordHintAnswer列而繞過加密!此時,我們索性連CustomerID列作為驗證列也一起加密,以絕后患 !

      注意:加密的驗證列也可以由另一個相關表的列作為參數傳入。

      看一個完整的例子:

      復制代碼 代碼如下:www.wf0088.com

      truncate table dbo.PWDQuestion
      go

      --添加兩個未加密的行
      INSERT dbo.PWDQuestion
      (CustomerID, PasswordHintQuestion, PasswordHintAnswer)
      select 13, '您出生的醫院名稱?',cast('浙江婦保院' as varbinary)
      union all
      select 14, '您出生的醫院名稱?',cast('浙江婦保二院' as varbinary)


      --打開對稱密鑰,連CustomerID列一起加密
      OPEN SYMMETRIC KEY sym_Demo
      DECRYPTION BY PASSWORD = 'newnew!456'
      UPDATE dbo.PWDQuestion
      SET PasswordHintAnswer =
      EncryptByKey(Key_GUID('sym_Demo'),
      PasswordHintAnswer,1,--1表示使用驗證器值
      CAST(CustomerID as varbinary))
      WHERE CustomerID in (13,14)
      --打開后切記關閉!!!3w@live.cn
      CLOSE SYMMETRIC KEY sym_Demo


      --此時必須這樣查看原數據
      OPEN SYMMETRIC KEY sym_Demo
      DECRYPTION BY PASSWORD = 'newnew!456'
      SELECT CustomerID,PasswordHintQuestion,
      CAST(DecryptByKey(PasswordHintAnswer, 1,--1表示使用驗證器值
      CAST(CustomerID as varbinary)) as varchar(200)) PasswordHintAnswer
      FROM dbo.PWDQuestion
      WHERE CustomerID = 13
      --打開后切記關閉。!3w@live.cn
      CLOSE SYMMETRIC KEY sym_Demo

      惡意替換開始:
      復制代碼 代碼如下:www.wf0088.com

      /**********************************************************
      --我們用剛才的CustomerID = 13的PasswordHintAnswer列值
      --替換CustomerID = 14的PasswordHintAnswer列值,
      --再用剛才讀取14的方法讀取真實值
      **********************************************************/

      update dbo.PWDQuestion set PasswordHintAnswer=
      (select PasswordHintAnswer from dbo.PWDQuestion where CustomerID = 14)
      where CustomerID = 13

      此時,我們再查看:
      復制代碼 代碼如下:www.wf0088.com

      OPEN SYMMETRIC KEY sym_Demo
      DECRYPTION BY PASSWORD = 'newnew!456'
      SELECT CustomerID,PasswordHintQuestion,
      CAST(DecryptByKey(PasswordHintAnswer, 1,--1表示使用驗證器值
      CAST(CustomerID as varbinary)) as varchar(200)) PasswordHintAnswer,
      PasswordHintAnswer as binaryValue
      FROM dbo.PWDQuestion
      WHERE CustomerID in(13,14)
      --打開后切記關閉!。3w@live.cn
      CLOSE SYMMETRIC KEY sym_Demo

      邀月工作室

      郎勒個郎!爽吧!雖然復制了相同的二進制數據,可是讀取結果令攻擊者大失所望啊!

      示例五、刪除對稱密鑰

      命令:DROP SYMMETRIC KEY 刪除指定的對稱密鑰( )

      例子:
      DROP SYMMETRIC KEY symDemoKey

      注意:如果加密密鑰打開沒有關閉,則drop失敗。

      小結:

      1、本文主要介紹對稱密鑰的創建、刪除、查看以及用它來修改加密方式、進行數據的加密和解密。

      2、對稱密鑰的特性是:在數據庫會話中使用它對數據進行加密和解密前必須首先打開。

      3、對稱密鑰可用于大數據的加密。

      下文將主要介紹證書加密(Certificate Encryption)

      邀月

      分享:SQL Server 2008中的代碼安全(八)透明加密(TDE)
      SQL Server 2008引入透明數據加密(Transparent Data Encryption),即TDE,它允許你完全無需修改應用程序代碼而對整個數據庫加密。

      來源:模板無憂//所屬分類:Mssql數據庫教程/更新時間:2013-04-23
      相關Mssql數據庫教程