(轉)筆記320 SQLSERVER中的加密函數 2013-7-11

 

  1 --SQLSERVER中的加密函數 2013-7-11
  2 ENCRYPTBYASYMKEY() --非對稱密鑰
  3 ENCRYPTBYCERT()   --證書加密
  4 ENCRYPTBYKEY()   --對稱密鑰
  5 ENCRYPTBYPASSPHRASE()  --通行短語(PassPhrase)加密
  6 
  7 
  8 ---------------------------------------------------------------------------------------
  9 --非對稱密鑰包含數據庫級的內部公鑰和私鑰,它能夠用來加密和解密SQL Server數據庫中的數據,
 10 --它能夠從外部文件或程序集中導入,也能夠在SQL Server數據庫中生成。它不像證書,不能夠備份到文件。
 11 --這意味着一旦在SQL Server中建立了它,沒有很是簡單的方法在其餘用戶數據庫中重用相同的密鑰。
 12 --非對稱密鑰對於數據庫加密屬於高安全選項,於是須要更多的SQL Server資源。
 13 --咱們看一組例子:
 14 
 15 --示例1、建立非對稱密鑰
 16 --
 17 --建立非對稱密鑰使用以下命令:
 18 
 19 --CREATE ASYMMETRIC KEY 
 20 
 21 
 22 
 23 --如下語句建立一個非對稱密鑰asymDemoKey
 24 
 25 use [pratice]
 26 go
 27 
 28 CREATE ASYMMETRIC KEY asymDemoKey --建立非對稱密鑰名稱
 29 WITH ALGORITHM = RSA_512 --加密安全類型
 30 ENCRYPTION BY PASSWORD = '123!' --密碼
 31 
 32 --示例2、查看當前數據庫中的非對稱密鑰
 33 
 34 --使用目錄視圖sys.asymmetric_keys(http://msdn.microsoft.com/en-us/library/ms188399.aspx)來查看。
 35 
 36 
 37 --查看當前數據庫中的非對稱密鑰
 38 USE [pratice]
 39 go
 40 
 41 SELECT name, algorithm_desc, pvt_key_encryption_type_desc
 42 FROM sys.asymmetric_keys
 43 
 44 
 45 --示例3、修改非對稱密鑰的私鑰密碼
 46 
 47 --你可使用帶有ENCRYPTION BY PASSWORD和DECRYPTION BY PASSWORD選項的
 48 --ALTER ASYMMETRIC KEY(http://technet.microsoft.com/en-us/library/ms189440.aspx)修改私鑰的密碼
 49 
 50 
 51 --修改私鑰密碼
 52 ALTER ASYMMETRIC KEY asymDemoKey--要修改的密鑰名稱
 53 WITH PRIVATE KEY --私鑰
 54 (ENCRYPTION BY PASSWORD = '456',--指定新密碼
 55 DECRYPTION BY PASSWORD = '123!')--舊密碼是用來解密的
 56 
 57 
 58 --示例4、使用非對稱密鑰對數據進行加密和解密。
 59 --
 60 --因爲同時須要公鑰和密鑰,在維護保密數據時使用非對稱密鑰來加密數據是很是安全的方式。
 61 --但同時用於大數據集時將消耗更多的資源。
 62 --
 63 --不推薦使用非對稱密鑰對數據加密,但它仍然是一個選擇。一旦將非對稱密鑰加到數據庫,就能夠用來加密和解密數據。
 64 --
 65 --用到如下兩個sql函數:
 66 --
 67 --EncryptByAsymKey 加密數據。(http://technet.microsoft.com/en-us/library/ms186950.aspx)
 68 --
 69 --DecryptByAsymKey解密數據。(http://msdn.microsoft.com/en-us/library/ms189507.aspx)
 70 
 71 --注意,在經過證書加密時,DecryptByAsymKey返回的是varbinary類型的加密數據。
 72 --
 73 --下面是一個例子:
 74 
 75 
 76 use [pratice]
 77 go
 78 
 79 --建立須要加密的數據
 80 Create Table BankUser
 81 (PKID int primary key identity(1,1)
 82 ,UserNo varbinary(1000) null  --必定要用二進制數據類型
 83 ,CurState datetime   not null
 84 )
 85 go
 86 
 87 insert into BankUser
 88 (UserNo,CurState)
 89 VALUES (EncryptByAsymKey(AsymKey_ID('asymDemoKey'),'137'),GETDATE())
 90 --插入一條記錄,字段UserNo存儲了加密的號碼值
 91 go
 92 
 93 
 94 
 95 --查看未加密的數據: 
 96 SELECT PKID,Curstate,
 97 cast
 98 (DecryptByAsymKey(AsymKey_ID('asymDemoKey'),UserNo,N'123')
 99 as varchar(1000)) as UserNo --須要原始私鑰
100 from BankUser
101 
102 
103 
104 
105 
106 --示例5、刪除非對稱密鑰
107 
108 --命令:DROP ASYMMETRIC KEY 刪除指定的非對稱密鑰( http://msdn.microsoft.com/en-us/library/ms188389.aspx)
109 --
110 --例子:
111 DROP ASYMMETRIC KEY asymDemoKey
112 
113 DROP TABLE [dbo].[BankUser]
114 
115 --小結:
116 --
117 --一、本文主要介紹非對稱密鑰的建立、刪除、查看以及用它來修改私鑰、進行數據的加密和解密。
118 --
119 --二、非對稱密鑰包含數據庫級的內部公鑰和私鑰,它能夠用來加密和解密SQL Server數據庫中的數據。
120 --
121 --三、非對稱密鑰對於數據庫加密屬於高安全選項,於是須要更多的SQL Server資源,不推薦使用。
122 --
123 --下文將主要介紹相對簡單的而且普遍應用的對稱密鑰加密(Symmetric Key Encryption)
124 -----------------------------------------------------------------------------------------------------
125 
126 --SQL Server 2008引入透明數據加密(Transparent Data Encryption),即TDE
127 --它容許你徹底無需修改應用程序代碼而對整個數據庫加密。
128 --
129 --當一個用戶數據庫可用且已啓用TDE時,在寫入到磁盤時在頁級實現加密。在數據頁讀入內存時解密。
130 --若是數據庫文件或數據庫備份被盜,沒有用來加密的原始證書將沒法訪問。
131 --這幾乎是SQL Server2008安全選項中最激動人心的功能了,有了它,咱們至少能夠將一些初級的惡意窺視拒之見外。
132 --下面的兩個例子將展現如何啓用和維護透明數據加密
133 --示例1、啓用透明加密(TDE)
134 
135 
136 USE Master
137 GO
138 --刪除舊主密鑰
139 --Drop MASTER KEY
140 --GO
141 --建立主密鑰
142 CREATE MASTER KEY ENCRYPTION BY PASSWORD ='B19ACE32-AB68-4589-81AE-010E9092FC6B'
143 GO
144 --建立證書,用於透明數據加密
145 CREATE CERTIFICATE TDE_Server_Certificate
146 WITH SUBJECT = 'Server-level cert for TDE'
147 GO
148 
149 USE [pratice]
150 GO
151 --第一步:如今開始透明加密
152 CREATE DATABASE ENCRYPTION KEY--建立數據庫加密密鑰
153     WITH ALGORITHM = TRIPLE_DES_3KEY--加密方式
154     ENCRYPTION BY SERVER CERTIFICATE TDE_Server_Certificate--使用服務器級證書加密
155 GO
156 /*
157 Warning: The certificate used for encrypting the database encryption key
158 has not been backed up.
159 You should immediately back up the certificate and the private key
160 associated with the certificate.
161 If the certificate ever becomes unavailable or
162 if you must restore or attach the database on another server,
163 you must have backups of both the certificate and the private key
164 or you will not be able to open the database.
165 */
166 
167 --第二步:打開加密開關
168 ALTER DATABASE [pratice] SET ENCRYPTION ON
169 GO
170 
171 --查看數據庫是否加密
172 SELECT  is_encrypted FROM    sys.databases
173 WHERE   name = 'pratice'
174 
175 --注意:一旦在數據庫應用了加密,應該馬上備份服務器級證書!
176 
177 --沒有加密dek的證書,該數據庫將沒法打開,附加到別的服務器也沒法使用,數據庫文件亦不會被Hack。
178 --若是一個DBA想要合法地將數據庫從一個SQL Server實例移動到另外一個SQL Server實例,
179 --那麼她應該首先備份服務器級證書,而後在新的SQL Server實例中建立證書。
180 --此時能夠合法地備份、還原數據庫或附加數據及日誌文件。
181 
182 --示例2、管理和移除透明加密(TDE)
183 USE [pratice]
184 GO
185 --修改加密算法
186 ALTER DATABASE  ENCRYPTION KEY
187 REGENERATE WITH ALGORITHM = AES_128
188 Go
189 
190 SELECT  DB_NAME(database_id) databasenm,
191         CASE encryption_state
192           WHEN 0 THEN 'No encryption'
193           WHEN 1 THEN 'Unencrypted'
194           WHEN 2 THEN 'Encryption in progress'
195           WHEN 3 THEN 'Encrypted'
196           WHEN 4 THEN 'Key change in progress'
197           WHEN 5 THEN 'Decryption in progress'
198         END encryption_state, key_algorithm, key_length
199 FROM    sys.dm_database_encryption_keys
200 
201 /*
202 對全部用戶數據庫的加密處理也包含對tempdb的處理 ,由於錶鏈接,臨時表都要用到tempdb
203 databasenm encryption_state key_algorithm key_length
204 tempdb Encrypted AES 256
205 DB_Encrypt_Demo Encrypted AES 128
206 */
207 
208 --除了更改dek的算法,咱們也能夠更改用來加密數據庫的服務器級證書(該證書應該按期更改)
209 
210 USE master
211 GO
212 CREATE CERTIFICATE TDE_Server_Certificate_V2
213 WITH SUBJECT = 'Server-level cert for TDE V2'
214 GO
215 USE [pratice]
216 GO
217 ALTER DATABASE ENCRYPTION KEY
218 ENCRYPTION BY SERVER CERTIFICATE TDE_Server_Certificate_V2
219 --用新證書修改DEK
220 
221 --移除數據庫透明加密
222 ALTER DATABASE [pratice]
223 SET ENCRYPTION OFF
224 GO
225 
226 --移除TDE後,能夠刪除DEK
227 USE [pratice]
228 GO
229 DROP DATABASE ENCRYPTION KEY
230 Go
231 
232 --注意:若是刪除DEK是SQL Server實例中最後一個使用TDE的用戶定義數據庫,
233 --在SQL Server實例重啓後,tempdb也將變爲不加密的狀態。
234 --
235 --小結:
236 --
237 --一、本文主要介紹透明數據加密(TDE)的使用。
238 --
239 --二、對DEK的修改同時影響到tempdb數據庫的加密狀態。
240 ------------------------------------------------------------------------------------------------
241 
242 --SQLServer 2008中的代碼安全(七) 證書加密
243 --
244 --證書能夠在數據庫中加密和解密數據。
245 --證書包含密鑰對、關於證書擁有者的信息、證書可用的開始和結束過時日期。
246 --
247 --證書同時包含公鑰和密鑰,前者用來加密,後者解密。SQL Server能夠生成它本身的證書,
248 --也能夠從外部文件或程序集載入。由於能夠備份而後從文件中載入它們,證書比非對稱密鑰更易於移植,
249 --而非對稱密鑰卻作不到。這意味着能夠在數據庫中方便地重用同一個證書。
250 
251 --注意:證書和非對稱密鑰一樣的消耗資源。
252 
253 --咱們看一組例子:
254 --
255 --示例1、建立數據庫證書
256 
257 --建立數據庫證書:CREATE SYMMETRIC KEY (http://msdn.microsoft.com/en-us/library/ms187798.aspx)
258 USE [pratice]
259 GO
260 --建立證書
261 CREATE CERTIFICATE cert_Demo --證書名稱
262 ENCRYPTION BY PASSWORD = '123!!!' --加密證書的密碼
263 WITH SUBJECT = 'DB_Encrypt_Demo Database Encryption Certificate',--證書主題
264 START_DATE = '3/14/2012', EXPIRY_DATE = '10/20/2016'--起止日期
265 GO
266 
267 --示例2、查看數據庫中的證書
268 
269 --使用目錄視圖sys.certificates(http://msdn.microsoft.com/en-us/library/ms189774.aspx)來查看。
270 
271 --查看當前數據庫中的證書
272 USE [pratice]
273 go
274 --查看證書
275 SELECT  name, pvt_key_encryption_type_desc, issuer_name
276 FROM    sys.certificates
277 
278 --示例3、備份和還原證書
279 
280 --建立證書後,也可使用BACKUP CERTIFICATE(http://msdn.microsoft.com/en-us/library/ms178578.aspx)
281 --命令備份到文件,爲了安全地保存或在其餘數據庫中還原它。
282 --備份證書
283 BACKUP CERTIFICATE cert_Demo
284 TO FILE = 'D:\certDemo.BAK'--證書備份路徑,用來加密
285 WITH PRIVATE KEY (FILE='D:\certDemoPK.BAK',--證書私鑰文件路徑,用來解密
286 ENCRYPTION BY PASSWORD = '465!!!',--加密私鑰密碼
287 DECRYPTION BY PASSWORD = '123!!!' )--解密私鑰密碼
288 
289 --備份後,能夠在其餘數據庫中使用這個證書,或使用DROP CERTIFICATE命令刪除它。
290 DROP CERTIFICATE cert_Demo
291 GO
292 --從備份文件中還原證書到數據庫中
293 CREATE CERTIFICATE cert_Demo
294 FROM FILE = 'D:\\certDemo.BAK'
295 WITH PRIVATE KEY (FILE = 'D:\certDemoPK.BAK',
296 DECRYPTION BY PASSWORD = '456!!!' ,--解密私鑰密碼
297 ENCRYPTION BY PASSWORD = '123!!!')--加密私鑰密碼
298 
299 --示例4、管理證書的私鑰
300 
301 --使用ALTER CERTIFICATE( http://msdn.microsoft.com/en-us/library/ms189511.aspx)
302 --命令爲證書增長或刪除私鑰。
303 --這個命令容許刪除私鑰(默認經過數據庫主密鑰加密)、增長私鑰或修改私鑰的密碼。
304 
305 --從證書中刪除私鑰
306 ALTER CERTIFICATE cert_Demo
307 REMOVE PRIVATE KEY
308 
309 --從備份文件爲既有證書從新增長私鑰
310 ALTER CERTIFICATE cert_Demo
311 WITH PRIVATE KEY
312 (FILE = 'D:\certDemoPK.BAK',
313 DECRYPTION BY PASSWORD = '1234GH!!!' ,--解密私鑰密碼
314 ENCRYPTION BY PASSWORD = '123!!!')--加密私鑰密碼
315 
316 --修改既有私鑰的密碼
317 ALTER CERTIFICATE cert_Demo
318 WITH PRIVATE KEY (DECRYPTION BY PASSWORD = '123!!!',
319 ENCRYPTION BY PASSWORD = '789!!!13E')
320 
321 
322 --示例5、使用證書加密和解密。
323 --
324 --使用函數EncryptByCert加密數據。(http://msdn.microsoft.com/zh-cn/library/ms174361.aspx)
325 USE [pratice]
326 GO
327 CREATE TABLE PWDQuestion
328 (
329   CustomerID INT ,
330   PasswordHintQuestion NVARCHAR(200) ,
331   PasswordHintAnswer NVARCHAR(200)
332 )
333 --插入測試數據
334 INSERT  dbo.PWDQuestion ( CustomerID, PasswordHintQuestion, PasswordHintAnswer )
335 VALUES  ( 10, '您出生的醫院名稱?', ENCRYPTBYCERT(CERT_ID('cert_Demo'), '北京四合院家中') )
336 
337 --查看密文
338 SELECT [PasswordHintQuestion], CAST(PasswordHintAnswer AS VARCHAR(200)) PasswordHintAnswer
339 FROM    dbo.PWDQuestion
340 WHERE   CustomerID = 10
341 
342 --查看原文
343 SELECT  PasswordHintQuestion,
344         CAST(DECRYPTBYCERT(CERT_ID('cert_Demo'), PasswordHintAnswer,
345                            N'789!!!13E') AS VARCHAR(200)) PasswordHintAnswer
346 FROM    dbo.PWDQuestion
347 WHERE   CustomerID = 10
348 
349 
350 
351 --示例6、使用對稱密鑰對數據進行加密和解密。
352 
353 --在前面的文章中,你已經看到打開用非對稱密鑰加密的對稱密鑰的演示,
354 --它分兩個步驟,首先用OPEN SYMMETRIC KEY命令,而後是實際的DecryptByKey函數調用。
355 --SQL Server也提供了可以將這兩個步驟合二爲一的額外的解密函數:
356 --DECRYPTBYKEYAUTOASYMKEY(http://msdn.microsoft.com/en-us/library/ms365420.aspx)
357 --和DecryptByKeyAutoCert(http://msdn.microsoft.com/en-us/library/ms182559.aspx)
358 USE [pratice]
359 GO
360 
361 --本例使用數據庫主密碼加密,於是不須要密碼。
362 ----Create master Key Encryption By password='123ASD!'
363 ----go
364 
365 --建立非對稱密鑰
366 CREATE ASYMMETRIC KEY asymDemo_V2
367 WITH ALGORITHM = RSA_512
368 --建立對稱密鑰
369 CREATE SYMMETRIC KEY sym_Demo_V2
370 WITH ALGORITHM = TRIPLE_DES
371 ENCRYPTION BY ASYMMETRIC KEY asymDemo_V2
372 
373 --打開對稱密鑰,插入記錄
374 OPEN SYMMETRIC KEY sym_Demo_V2
375 DECRYPTION BY ASYMMETRIC KEY asymDemo_V2
376 INSERT  dbo.PWDQuestion ( CustomerID, PasswordHintQuestion, PasswordHintAnswer )
377 VALUES  ( 22, '您出生的醫院名稱?', ENCRYPTBYKEY(KEY_GUID('sym_Demo_V2'), '邵逸夫醫院') )
378 CLOSE SYMMETRIC KEY sym_Demo_V2
379 
380 --此時,使用DecryptByKeyAutoAsymKey解密數據,只須要一個操做
381 SELECT  CAST(DECRYPTBYKEYAUTOASYMKEY(ASYMKEY_ID('asymDemo_V2'), NULL,
382                                      PasswordHintAnswer) AS VARCHAR)
383 FROM    dbo.PWDQuestion
384 WHERE   CustomerID = 22
385 
386 --小結:
387 --
388 --一、本文主要介紹證書的建立、刪除、查看以及用它來修改加密方式、進行數據的加密和解密。
389 --
390 --二、證書加密和非對稱密鑰加密相對對稱密鑰加密更爲消耗資源。
391 --
392 --下文將主要介紹SQL Server中最爲使人鼓舞的透明數據加密(TDE)
393 -----------------------------------------------------------------------------------------
394 --SQL Server 2008中的代碼安全(六):對稱密鑰加密
395 
396 --證書和非對稱密鑰使用數據庫級的內部公鑰加密數據,而且使用數據庫級內部私鑰解密數據。
397 --而對稱密鑰相對簡單,它們包含一個同時用來加密和解密的密鑰。
398 --困此,使用對稱密鑰加密數據更快,而且用在大數據時更加合適。
399 --儘管複雜度是考慮使用它的因素,但它仍然是一個很好的加密數據的選擇。
400 
401 
402 
403 --示例1、建立對稱密鑰
404 --
405 --對稱密鑰的特性是:在數據庫會話中使用它對數據進行加密和解密前必須首先打開。
406 --
407 --建立對稱密鑰使用以下命令:CREATE SYMMETRIC KEY  建立對稱密鑰。
408 --(http://msdn.microsoft.com/en-us/library/ms188357.aspx)
409 
410 USE [pratice]
411 go
412 
413 -- 建立一個用於加密對稱密鑰的非對稱密鑰
414 CREATE ASYMMETRIC KEY symDemoKey --名稱
415 WITH ALGORITHM = RSA_512     --加密算法
416 ENCRYPTION BY PASSWORD ='TestSYM456!'
417 --密碼
418 
419 -- 建立一個對稱密鑰
420 CREATE SYMMETRIC KEY sym_Demo
421 WITH ALGORITHM = TRIPLE_DES
422 ENCRYPTION BY ASYMMETRIC KEY symDemoKey
423 
424 --示例2、查看當前數據庫中的對稱密鑰
425 --
426 --使用目錄視圖sys.symmetric_keys(http://msdn.microsoft.com/en-us/library/ms189446.aspx)來查看。
427 --查看當前數據庫中的非對稱密鑰
428 USE [pratice]
429 go
430 SELECT  name, algorithm_desc
431 FROM    sys.symmetric_keys
432 
433 
434 --示例3、修改非對稱密鑰的加密方式
435 --
436 --你可使用ALTER SYMMETRIC KEY(http://technet.microsoft.com/en-us/library/ms189440.aspx)命令修改
437 --對稱密鑰的加密方式。
438 --但執行前必須使用OPEN SYMMETRIC KEY(http://msdn.microsoft.com/en-us/library/ms190499.aspx)命令打開它。
439 USE [pratice]
440 go
441 
442 --先用私鑰密碼打開對稱密鑰
443 OPEN SYMMETRIC KEY sym_Demo
444 DECRYPTION BY ASYMMETRIC KEY symDemoKey
445 WITH PASSWORD ='TestSYM456!'
446 
447 --打開以後,先增長密碼加密,取代原密鑰
448 ALTER SYMMETRIC KEY sym_Demo
449 ADD ENCRYPTION BY PASSWORD ='newnew!456'
450 --再刪除非對稱密鑰加密
451 ALTER SYMMETRIC KEY sym_Demo
452 DROP ENCRYPTION BY ASYMMETRIC KEY symDemoKey
453 --完成操做後,關閉對稱密鑰
454 CLOSE SYMMETRIC KEY sym_Demo
455 
456 --示例4、使用對稱密鑰對數據進行加密和解密。
457 --
458 --一、爲了使用對稱密鑰對數據進行加密,必須首先打開它,
459 --而後使用函數EncryptByKey 加密數據。(http://msdn.microsoft.com/zh-cn/library/ms174361.aspx)
460 
461 --二、使用DecryptByKey來解密使用對稱密鑰加密的數據。注意DecryptByKey不像EncryptByKey,
462 --無須使用對稱密鑰GUID。所以,爲了解密,必須打開正確的對稱密鑰會話,不然會顯示null。
463 --
464 --下面是一個例子:
465 USE [pratice]
466 GO
467 --DROP TABLE [dbo].[PWDQuestion]
468 --GO
469 --建立測試數據表,用於對稱加密
470 CREATE TABLE dbo.PWDQuestion
471 (
472   CustomerID INT NOT NULL PRIMARY KEY ,
473   PasswordHintQuestion NVARCHAR(300) NOT NULL ,
474   PasswordHintAnswer VARBINARY(200) NOT NULL
475 )
476 GO
477 --插入加密數據
478 OPEN SYMMETRIC KEY sym_Demo
479 DECRYPTION BY PASSWORD ='newnew!456'
480 INSERT  dbo.PWDQuestion ( CustomerID, PasswordHintQuestion, PasswordHintAnswer )
481 VALUES  ( 12, '您出生的醫院名稱?', ENCRYPTBYKEY(KEY_GUID('sym_Demo '), '杭州市一') )
482 CLOSE SYMMETRIC KEY sym_Demo
483 
484 --查看未加密的數據:
485 --解密數據
486 OPEN SYMMETRIC KEY sym_Demo
487 DECRYPTION BY PASSWORD ='newnew!456'
488 SELECT  CustomerID, PasswordHintQuestion,
489         CAST(DECRYPTBYKEY(PasswordHintAnswer) AS VARCHAR(200)) PasswordHintAnswer
490 FROM    dbo.PWDQuestion
491 WHERE   CustomerID = 12
492 --打開後切記關閉!!!
493 CLOSE SYMMETRIC KEY sym_Demo
494 
495 --不打開直接讀取
496 SELECT  CustomerID, PasswordHintQuestion,
497         CAST(DECRYPTBYKEY(PasswordHintAnswer) AS VARCHAR(200)) PasswordHintAnswer
498 FROM    dbo.PWDQuestion
499 WHERE   CustomerID = 12
500 
501 
502 --至此,好像已經大功告成了,別,千萬別高興得太早!
503 
504 --這裏有個問題,若是惡意用戶不知道CustomerID=13的PasswordHintAnswer列的真實值,
505 --但知道CustomerID=14的PasswordHintAnswer列的真實值,
506 --則徹底能夠經過惡意替換PasswordHintAnswer列而繞過加密!!
507 --此時,咱們索性連CustomerID列做爲驗證列也一塊兒加密,以絕後患 !
508 --
509 --注意:加密的驗證列也能夠由另外一個相關表的列做爲參數傳入。
510 
511 --示例5、刪除對稱密鑰
512 
513 --命令:DROP SYMMETRIC KEY 刪除指定的對稱密鑰( http://technet.microsoft.com/en-us/library/ms182698.aspx)
514 --
515 --例子:
516 
517 DROP SYMMETRIC KEY sym_Demo
518 --注意:若是加密密鑰打開沒有關閉,則drop失敗。
519 
520 --小結:
521 --
522 --一、本文主要介紹對稱密鑰的建立、刪除、查看以及用它來修改加密方式、進行數據的加密和解密。
523 --
524 --二、對稱密鑰的特性是:在數據庫會話中使用它對數據進行加密和解密前必須首先打開。
525 --
526 --三、對稱密鑰可用於大數據的加密。
527 -------------------------------------------------------------------------------------------
528 --SQL Server 2008中的代碼安全(四):主密鑰
529 --在SQL Server中的加密由層次結構形式進行處理以提供多級別的安全。
530 --SQL Server包含兩個用於加密數據的密鑰類型。以下圖:
531 --一、服務器主密鑰(Service Master Key),位於層次結構的最頂端,而且在安裝SQL Server時自動建立,
532 --用於加密系統數據、連接的服務器登陸名以及數據庫主密鑰。
533 --在第一次經過SQL Server使用服務主密鑰來加密證書、數據庫主密鑰或連接的服務器主密碼時,
534 --服務主密鑰會自動生成,而且使用SQL Server服務帳戶的Windows證書來生成它。
535 --若是必須改變SQL Server服務帳號,微軟建議使用SQL Server配置管理器,
536 --由於這個工具將執行生成新服務主密鑰須要的合適的解密和加密方法,並且可使加密層次結構保持完整。
537 --服務主密鑰也用於加密其下的數據庫主密鑰。
538 --
539 --二、數據庫主密鑰(Database Master Key),用於加密證書,以及非對稱密鑰和對稱密鑰。
540 --全部數據庫均可以只包含一個數據庫主密鑰,在建立它時,經過服務主密鑰對其加密。
541 --建立非對稱密鑰時,能夠決定在加密非對稱密鑰對應的私鑰是否包含密碼。
542 --若是示包含密碼,將使用數據庫主密鑰來加密私鑰。
543 --
544 --咱們看一組例子:
545 --
546 --示例1、備份及還原服務主密鑰
547 --例1、備份及還原服務主密鑰
548 --
549 --用到如下兩個sql命令:
550 --
551 --BACKUP SERVICE MASTER KEY  導出服務主密鑰。(http://msdn.microsoft.com/zh-cn/library/ms190337.aspx)
552 --
553 --RESTORE SERVICE MASTER KEY從備份文件中導入服務主密鑰。(http://msdn.microsoft.com/zh-cn/library/ms187972.aspx)
554 
555 --如下語句備份服務主密鑰到C:\SqlBackup\SMK.bak
556 
557 BACKUP SERVICE MASTER KEY
558 TO FILE='D:\SMK.bak'
559 ENCRYPTION BY PASSWORD ='123!1AB'
560 ----注意該密碼可使用單引號
561 go
562 
563 --恢復服務主密鑰
564 RESTORE SERVICE MASTER KEY
565 FROM FILE='D:\SMK.bak'
566 DECRYPTION BY PASSWORD ='123!1AB'
567 go
568 
569 
570 
571 --若是該密鑰沒有實際變化,而執行密鑰恢復時,會收到提示:
572 
573 --The old and new master keys are identical. No data re-encryption is required.
574 
575 --示例2、建立、再生成和刪除數據庫主密鑰
576 --
577 --用到如下兩個sql命令:
578 --
579 --CREATE MASTER KEY 建立數據庫主密鑰(http://technet.microsoft.com/zh-cn/library/ms174382.aspx)
580 --
581 --ALTER MASTER KEY 從新生成數據庫主密鑰(http://msdn.microsoft.com/en-us/library/ms186937%28SQL.90%29.aspx)
582 --
583 --DROP MASTER KEY 刪除數據庫主密鑰(http://msdn.microsoft.com/en-us/library/ms180071.aspx)
584 --
585 --當數據庫主密鑰被顯式建立時,會同時自動生成一個額外生成的安全層,
586 --用於加密數據庫中的新證書和非對稱密鑰,更進一步保護已加密的數據。
587 
588 IF NOT EXISTS ( SELECT  name
589                 FROM    sys.databases
590                 WHERE   name = 'BookStore' )
591     BEGIN
592         CREATE DATABASE BookStore
593     END
594 GO
595 
596 USE BookStore
597 GO
598 --建立數據庫主密鑰
599 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
600 go
601 
602 USE BookStore
603 GO
604 --從新生成數據庫主密鑰
605 ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD ='password'
606 
607 --刪除數據庫主密鑰
608 USE BookStore
609 GO
610 DROP MASTER KEY
611 
612 
613 --注意:若是該數據庫主密鑰仍然被其餘數據庫對象使用,則不能被刪除,這點與架構相似。
614 --
615 --同時一旦建立數據庫主密鑰,就馬上備份它是一個好的習慣。
616 --備份數據庫主密鑰
617 USE BookStore
618 GO
619 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MagneticFields!'
620 GO
621 BACKUP MASTER KEY TO FILE='D:\BookStore_Master_Key.BAK'
622 ENCRYPTION BY PASSWORD ='4D280837!!!'
623 
624 --恢復數據庫主密鑰
625 RESTORE MASTER KEY FROM FILE='D:\BookStore_Master_Key.BAK'
626 DECRYPTION BY PASSWORD ='4D280837!!!'
627 ENCRYPTION BY PASSWORD ='MagneticFields!'
628 
629 --與服務主密鑰相似,若是沒有修改,則會收到以下提示:
630 
631 --The old and new master keys are identical. No data re-encryption is required.
632 
633 --示例3、從數據庫主密鑰刪除服務主密鑰
634 --
635 --當一個數據庫主密鑰被建立時,它被默認使用兩種方式加密:
636 --服務主密鑰和被使用CREATE MASTER KEY 命令中使用的密碼。
637 --若是你不想使用服務主密碼加密數據庫主密鑰
638 --(這種狀況下,擁有sysadmin特權的login在不知道數據庫主密鑰的前提下將不能訪問加密數據),
639 --你可使用ALTER MASTER KEY 命令刪除服務主密鑰。
640 --
641 --簡略語法以下:
642 
643 ALTER MASTER KEY
644 
645 ADD ENCRYPTION BY SERVICE MASTER KEY |
646 
647 DROP ENCRYPTION BY SERVICE MASTER KEY
648 
649 --因爲服務主密鑰容許擁有足夠許可(如sysadmin)的用戶自動使用數據庫主密鑰解密,
650 --所以,一旦刪除了服務主密鑰的加密,而再想修改數據庫主密鑰時,你必須使用一個新的命令訪問它。
651 --OPEN MASTER KEY, 語法以下:
652 
653 OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
654 
655 --下面是一個例子:
656 ALTER MASTER KEY DROP ENCRYPTION BY SERVICE MASTER KEY
657 
658 --一旦執行,任何數據庫主密鑰的修改須要使用OPEN MASTER KEY的口令訪問,
659 --這樣是爲了從新應用服務主密鑰的加密
660 OPEN MASTER KEY DECRYPTION BY PASSWORD ='123456!'
661 
662 --一旦服務主密鑰被用於加密數據庫主密鑰,數據庫主密鑰再也不須要被顯式打開或關閉。
663 ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
664 
665 --關閉數據庫主密鑰
666 CLOSE MASTER KEY
667 
668 --小結:
669 --
670 --一、本文主要介紹服務主密鑰的備份與還原,數據庫的主密鑰的建立、從新生成、刪除和備份、還原。
671 --
672 --二、一旦建立主密鑰,馬上備份它是一個很好的習慣。
673 
674 ------------------------------------------------------------------------------------
675 --SQL Server 2008中的代碼安全(三):經過PassPhrase加密
676 
677 --導讀:本文主要涉及EncryptByPassPhrase和DecryptByPassPhrase函數進行通行短語(PassPhrase)加密。
678 
679 --前言:
680 --
681 --在SQL Server 2005和SQL Server 2008以前。
682 --若是但願加密敏感數據,如財務信息、工資或身份證號,必須藉助外部應用程序或算法。
683 --SQL Server 2005引入內建數據加密的能力,使用證書、密鑰和系統函數的組合來完成。
684 --
685 --與數字證書相似。SQL Server 證書包括公鑰和私鑰這一對密鑰,它們都用來加密和解密數據。
686 --SQL Server也擁有建立非對稱密鑰和對稱密鑰對象的能力。非對稱密鑰(asymmetric key)與證書類似,
687 --公鑰用來加密數據庫,私鑰用來解密數據。
688 --非對稱密鑰和證書都提供了強大的加密強度。但在完成複雜的加密|解密過程當中具備更多的性能開銷。
689 --更適合對大量數據進行加密,且具備較低性能開銷的解決方案是對稱密鑰(symmetric key),
690 --它是對相同數據進行加密和解密的一個密鑰。
691 --
692 --SQL Server容許將這些加密能力放到加密層次結構中。
693 --當安裝了SQL Server後,在數據庫master中建立名爲服務主密鑰的服務器級別證書,
694 --並將其默綁定到SQL Server服務帳號登陸名。
695 --服務主密鑰用來加密全部其餘數據庫證書和建立在SQL Server實例中的密鑰。
696 --另外,你也能夠在用戶數據庫中建立數據庫主密鑰(Database Master Key),
697 --它能夠用來加密數據庫證書和密鑰。
698 --
699 --在SQL Server 2008中,微軟引入了透明數據加密(TDE),它對整個數據庫進行加密,
700 --而不須要修改任何訪問它的應用程序。數據、日誌文件和相關的數據庫備份都是加密的。
701 --假如數據庫被偷,若是沒有數據庫加密密鑰(DEK)是不能訪問數據的。
702 --本文及後面幾篇文章將會舉例說明。
703 
704 --在SQL Server 2008中,還引入了對可擴展密鑰管理(EKM)的支持,
705 --也就意味着SQL Server可使用硬件安全模塊(HSM)來存儲和和管理加密密鑰。
706 --HSM能夠減小數據和實際的加密密鑰耦合。
707 
708 --此部份內容共分六篇文章:
709 --一、經過PassPhrase加密
710 --二、主密鑰
711 --三、非對稱密鑰加密
712 --四、對稱密鑰加密
713 --五、證書加密
714 --六、透明數據加密
715 
716 --1、經過通行短語(PassPhrase)加密
717 --
718 --對於不涉及證書及密鑰的應急的數據加密,能夠直接基於用戶提供的密碼來加密和解密數據。
719 --通行短語(PassPhrase)是容許存在空格的密碼。
720 --這個PassPhrase不會存儲在數據庫中,於是也就意味着不會被使用存儲的系統數據「破解」。
721 --同時,可使用空格建立一個長的、易於記憶的句子來加密和解密敏感數據。
722 
723 --咱們須要瞭解的一對函數是ENCRYPTBYPASSPHRASE(http://technet.microsoft.com/zh-cn/library/ms190357.aspx)和DECRYPTBYPASSPHRASE(http://technet.microsoft.com/zh-cn/library/ms188910.aspx)
724 --
725 --這一對函數必須使用相同的參數。
726 --
727 --咱們看一個示例:
728 USE [pratice]
729 go
730 
731 -- Table used to store the encrypted data
732 -- for the purposes of this recipe
733 --DROP TABLE SecretInfo
734 --GO
735 
736 CREATE TABLE SecretInfo
737 (
738   MySecret varbinary(max) NOT NULL  --必定要二進制數據格式
739 )
740 GO
741 
742 INSERT  SecretInfo ( MySecret ) SELECT  ENCRYPTBYPASSPHRASE('123456','你好啊')
743 
744 SELECT  MySecret FROM    SecretInfo
745 
746 
747 
748 --想知道原文本的內容,使用如下語句:
749 
750 
751 SELECT  CAST(DECRYPTBYPASSPHRASE('123456', MySecret) AS VARCHAR(MAX))
752 FROM    SecretInfo
753 
754 
755 --注意:
756 --
757 --一、使用通行短語進行加密數據,不用擔憂sysadmin服務器角色成員讀取數據
758 --(在後面文章會看到,服務器角色成員sysadmin擁有讀取其餘形式的加密數據的內在權限。)
759 --
760 --
761 --二、假定沒有將密碼存儲在表中或在任何模塊(存儲過程、觸發器等)中使用密碼,
762 --加密的數據將防止從數據庫備份被偷竊或在SQL Server實例中的數據庫中滲透。
763 --若是通行短語短語密碼泄漏,數據就能夠被解密。
相關文章
相關標籤/搜索