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 --若是通行短语短语密码泄漏,数据就能够被解密。