以下範例建立一個具有儲存加密,讀取解密的資料表
參考網址:
http://dotnetframework.blogspot.tw/2011/01/blog-post.html
http://www.dotblogs.com.tw/dc690216/archive/2009/09/10/10559.aspx
1.建立非對稱金鑰。指定name=mykey, pwd=p@ssw0rd
- CREATE ASYMMETRIC KEY mykey
- WITH ALGORITHM = RSA_2048
- ENCRYPTION BY PASSWORD = 'p@ssw0rd';
- GO
2.查詢第1步驟所建立的key是否成功。
- select * from sys.asymmetric_keys
3.建立測試資料表
4.建立新增、更新、刪除資料表的預存程序。
- USE [EIP_new]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- CREATE PROCEDURE [dbo].[sp_BPM_Modify_t_BPM_Seal_type_E]
- @action_type NCHAR(1) = '' ,
- @id INT = 0,
- @username NVARCHAR(50) = '',
- @uid NVARCHAR(10) = '',
- @pwd NVARCHAR(30) = '',
- @sort INT = 0,
- @cdt DateTime
- AS
- BEGIN
- SET NOCOUNT ON;
- --傳入資料檢核
- IF (@action_type NOT IN ('A','D','U'))
- BEGIN
- DECLARE @DBID INT;
- SET @DBID = DB_ID();
- DECLARE @DBNAME NVARCHAR(128);
- SET @DBNAME = DB_NAME();
- RAISERROR
- (N'資料庫 ID:%d, 資料庫名稱: %s。 錯誤訊息:傳入的Action_Mode,必須是 A, U, D 其中一種',
- 10, -- Severity.
- 1, -- State.
- @DBID, -- First substitution argument.
- @DBNAME); -- Second substitution argument.
- END
- --宣告加密用變數
- DECLARE
- @encryp_uid NVARCHAR(max),
- @encryp_pwd NVARCHAR(max),
- @encryp_sort NVARCHAR(max)
- --SET @encryp_uid = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),@uid)
- SET @encryp_uid = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),CONVERT(nvarchar(max), @uid))
- --SET @encryp_pwd = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),@pwd)
- SET @encryp_pwd = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),CONVERT(nvarchar(max), @pwd))
- SET @encryp_sort = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),CONVERT(NVARCHAR(10),@sort))
- SET @encryp_uid = ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),CONVERT(nvarchar(max), @uid))
- --插入
- IF (@action_type = 'A')
- BEGIN
- INSERT INTO t_BPM_Seal_type_E
- (
- username ,
- [uid] ,
- pwd ,
- sort ,
- cdt
- )
- VALUES
- (
- @username,
- @encryp_uid,
- @encryp_pwd,
- @encryp_sort,
- @cdt
- )
- END
- --更新
- IF (@action_type = 'U')
- BEGIN
- UPDATE t_BPM_Seal_type_E
- SET username=@username,
- [uid]=@encryp_uid,
- pwd=@encryp_pwd,
- cdt=@cdt
- WHERE id=@id
- END
- --刪除
- IF (@action_type = 'D')
- BEGIN
- DELETE t_BPM_Seal_type_E
- WHERE id=@id
- END
- END
- GO
5.建立檢視資料表,用來讀取被加密的資料表
- CREATE VIEW [dbo].[v_BPM_Seal_type_E]
- AS
- SELECT id, username, CONVERT(NVARCHAR(50), DECRYPTBYASYMKEY(ASYMKEY_ID('mykey'), uid, N'p@ssw0rd')) AS uid, CONVERT(NVARCHAR(50),
- DECRYPTBYASYMKEY(ASYMKEY_ID('mykey'), pwd, N'p@ssw0rd')) AS pwd, CONVERT(NVARCHAR(50),
- DECRYPTBYASYMKEY(ASYMKEY_ID('mykey'), sort, N'p@ssw0rd')) AS sort, cdt
- FROM dbo.t_BPM_Seal_type_E
6.最後查詢被加密的資料表。
上面是未解密原資料表,下面是已解密的檢視(使用第5步驟建立的檢視表)
7.直接查詢,不透過檢視表(View)
- Select id,
- ENCRYPTBYASYMKEY(ASYMKEY_ID('mykey'),
- CONVERT(nvarchar(max), username)) as '加密'
- From dbo.t_BPM_Seal_type_E
- Select id,
- CONVERT(nvarchar(10), DECRYPTBYASYMKEY(ASYMKEY_ID('mykey'), uid, N'p@ssw0rd')) as '解密'
- From dbo.t_BPM_Seal_type_E