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 --若是通行短語短語密碼泄漏,數據就能夠被解密。