• 不直接访问远程的数据库,而是通过中间件(专业DBA的博客)


    建议不直接访问远程的数据库,而是通过中间件。

    或者找到好的加密方式。http://blog.csdn.net/sqlserverdiscovery/article/details/8068318

    在SQL Server 2005引入了内建数据加密,通过系统函数、证书、密钥完成加密。

    一、通过函数加密。

    二、与通过证书授权实现的数字证书相似,SQL Server证书包括了公钥和私钥这一对密钥,是数据库级的安全对象,他们用来加密和解密数据。

    三、SQL Server还拥有创建非对称密钥和对称密钥的能力。非对称密钥与证书相似,公钥用来加密数据库,私钥用来解密数据。非对称密钥和证书都提供了强大的加密强度,但在完成复杂的加密、解密过程时,需要更多的性能开销。对称密钥更适合对大量数据进行加密,且具有较低性能开销,它是对相同数据进行加密和解密的一个密钥。

    四、SQL Server将这种加密能力放到加密层次结构中,当安装了SQL Server后,在数据库master中创建名为服务主密钥的服务器级别证书,并将其绑定到SQL Server服务账户登录名。

    服务主密钥用来加密所有其他数据库证书和创建在SQL Server实例中的密钥。另外,你也可以在用户数据库中创建数据库主密钥,它可以用来加密数据库证书和密钥。

    五、在SQL Server 2008中引入了透明数据加密,它对整个数据库进行加密,而不需要修改任何访问它的应用程序。数据、日志文件和相关的数据库备份都是加密的。如果数据库被窃取,那么如果没有数据库加密密钥,是不能访问数据的。此外,还引入了可扩展密钥管理的支持,也就是SQL Server可以使用硬件安全模块来存储和管理加密密钥,从而减少数据和实际加密密钥的耦合。

    1、通过通行短语来加密

    对于一个不涉及证书和密钥的应急的数据加密,可以直接基于用户提供的密码来加密、解密数据。通行短语允许密码中存在空格,而且密码不会存储在数据库中。使用通行短语可以创建一个易于记忆的句子来加密解密数据。

    [sql] view plain copy
     
    1. create table #SecretInfo  
    2. (secret varbinary(8000) not null) --存放经过加密的二进制数据  
    3. go  
    4.   
    5.   
    6. --用通行短语来加密  
    7. insert #SecretInfo(secret)  
    8. select ENCRYPTBYPASSPHRASE(  
    9.             'My password used to encrypt this string in 2008.', --通行短语  
    10.             'This is the text I need to secure.'                --需要加密的文本  
    11.             )  
    12.               
    13. --用通行短语来解密  
    14. select CAST(  
    15.               DECRYPTBYPASSPHRASE(  
    16.                    'My password used to encrypt this string in 2008.',  
    17.                    secret)  
    18.               as varchar(100)  --解密后是二进制数据,必须要转化成文本  
    19.            )  
    20. from #SecretInfo              

    2、主密钥

    在SQL Server中把加密放到层次结构形式中,可以提供多级别的安全。SQL Server包含两个用于加密数据的密钥类型。

    第一个是服务主密钥,位于层次结构的顶端,在安装SQL Server时自动创建,服务主密钥也可以用来加密其下的数据库主密钥、证书、链接服务器密码。在第一次加密时,服务主密钥会自动生成,并且使用SQL Server服务账户的Windows证书来生成它,如果必须修改SQL Server服务账户,建议使用SQL Server配置管理器,因为这个工具会生成新服务主密钥需要的合适的加密、解密方法,而且保持加密层次结构的完整。

    第二个是数据库主密钥,位于加密层次结构中SQL Server安全性的其它层,用来加密数据库证书、非对称密钥、对称密钥。所有数据库都可以只包含一个数据库主密钥,创建时通过服务主密钥对其加密。创建非对称密钥时,可以决定在加密非对称密钥对中的私钥时,是否包含密码。如果不包含密码,将使用数据库主密钥来加密私钥。

    [sql] view plain copy
     
    1. --1.1备份服务主密钥  
    2. backup service master key   
    3. to file ='c:smk.bak'                  --服务主密钥备份导出的文件路径  
    4. encryption by password = 'c:smk.bak'  --用来加密:包含密钥备份的文件的密码  
    5.       
    6.       
    7. --1.2还原服务主密钥  
    8. restore service master key  
    9. from file = 'c:smk.bak'  
    10. decryption by password = 'c:smk.bak'     
    11.   
    12.   
    13. --1.3参数force强制替换现有的服务主密钥,可能会使加密的数据不能被解密  
    14. restore service master key  
    15. from file = 'c:smk.bak'  
    16. decryption by password = 'c:smk.bak' force  
    17.   
    18.   
    19.   
    20. --2.数据库主密钥  
    21. use AdventureWorks  
    22. go  
    23.   
    24. --2.1创建数据库主密钥  
    25. create master key   
    26. encryption by password = 'AdventureWorks'  
    27.   
    28.   
    29. --2.2用新的密码重新生成数据库主密钥  
    30. alter master key  
    31. regenerate with encryption by password = '123456'  
    32.   
    33.   
    34. --2.3在没有用数据库主密钥加密其他密钥时,才可以删除数据库主密钥  
    35. drop master key  
    36.   
    37.   
    38. --2.4备份数据库主密钥  
    39. backup master key   
    40. to file = 'c:master_key.bak'  
    41. encryption by password = 'c:master_key.bak'  --保护备份文件的密码  
    42.   
    43.   
    44. --2.5还原数据库主密钥  
    45. restore master key  
    46. from file = 'c:master_key.bak'  
    47. decryption by password = 'c:master_key.bak'  --解密备份文件的密码  
    48. encryption by password = '1234567'            --还原后的数据库主密钥,进行加密的密码  
    49.   
    50.   
    51. restore master key  
    52. from file = 'c:master_key.bak'  
    53. decryption by password = 'c:master_key.bak'  --解密备份文件的密码  
    54. encryption by password = '1234567'            --还原后的数据库主密钥,进行加密的密码  
    55. force   --只有在主密钥无法恢复或解密失败时,才使用FORCE选项  
    56.   
    57.   
    58. /*===================================================  
    59. 2.6  
    60. 在创建数据库主密钥时,默认使用两种方法对它进行加密:  
    61. 服务主密钥和create master key中使用的密码。  
    62. 如果不希望通过服务主密钥对数据库主密钥进行加密,  
    63. 那么可以删除服务主密钥加密。  
    64.   
    65. 需要特别注意的是,如果删除了服务主密钥加密,  
    66. 那么有sysadmin权限的SQL登录名,有了数据库主密钥的密码,才能访问加密数据。  
    67. 因为服务主密钥允许有sysadmin权限的用户,自动对数据库主密钥进行解密,访问加密数据。  
    68. =====================================================*/  
    69. --从数据库主密钥,删除服务主密钥加密  
    70. alter master key  
    71. drop encryption by service master key  
    72.   
    73. --如果要重新使用服务主密钥来加密,必须打开数据库主密钥  
    74. open master key  
    75. decryption by password = 'AdventureWorks'  
    76.   
    77. --然后服务主密钥重新被添加到数据库主密钥中  
    78. alter master key  
    79. add encryption by service master key  
    80.   
    81. --关闭数据库主密钥  
    82. close master key  


    3、非对称密钥加密

    非对称密钥包含了数据库级的内部公钥和私钥,可以用来加密和解密SQL Server数据库中的数据。公钥用来加密数据,而私钥用来解密数据,会用创建非对称密钥时提供的密码,或者数据库主密钥,对私钥进行加密来保护私钥。

    非对称密钥可以从外部文件或程序集中导入,并且可以在数据库中生成。不像证书,非对称密钥不可以备份到文件,也就是创建了非对称密钥后没有简单的办法在其他数据库中重用相同的密钥。

    非对称密钥是数据加密的高级选项,当用在大数据集时,非对称密钥进行加密相对于对称密钥加密来说,比较耗费资源,对称密钥使用一个密钥来加密和解密,速度更快。

    用非对称密钥加密时,不用打开,只需要引用非对称密钥的id。

    [sql] view plain copy
     
    1. --1.创建非对称密钥  
    2. create asymmetric key asymKey  
    3. with algorithm = RSA_512              --加密算法:RSA_512,RSA_1024,RSA_2048  
    4. ENCRYPTION BY PASSWORD = 'asymKey123' --加密私钥的密码,如果不提供密码,  
    5.                                       --会自动用数据库主密钥对私钥进行加密  
    6.                                       
    7.   
    8. create asymmetric key asymKey1          
    9. with algorithm = RSA_512        --这里没有提供密码,所以自动用数据库主密码来加密  
    10.   
    11.   
    12. --2.查询非对称密钥  
    13. select name,                           --费对称密钥名称  
    14.        asymmetric_key_id,              --非对称密钥id  
    15.        pvt_key_encryption_type_desc,   --私钥的加密方法  
    16.        algorithm_desc,                 --加密算法  
    17.        key_length,                     --键的长度  
    18.          
    19.        sid,  
    20.        string_sid,  
    21.        public_key                      --公钥  
    22. from sys.asymmetric_keys  
    23.   
    24.   
    25.   
    26. create table booksellerbankrouting  
    27. (booksellerid int not null primary key,  
    28.  bankroutingNBR varbinary(300) not null)  
    29.   
    30. --3.用非对称密钥来加密加密   
    31. insert into dbo.booksellerbankrouting  
    32. values(  
    33.    1,  
    34.    ENCRYPTBYASYMKEY(asymkey_id('asymKey'),                        --非对称密钥的id  
    35.                     'this string will be encrypted with asymkey.' --要加密的文体  
    36.                    )  
    37.   )  
    38.     
    39.   
    40. --4.直接查询显示的是乱码  
    41. select CAST(bankroutingNBR as varchar(100))  
    42. from dbo.booksellerbankrouting  
    43.   
    44.   
    45.   
    46. --5.解密,显示正确的数据  
    47. select CAST(DECRYPTBYASYMKEY(  
    48.                    asymkey_id('asymKey'), --非对称密钥id  
    49.                    bankroutingNBR,        --需要解密的文本  
    50.                    N'asymKey123'          --非对称密钥的私钥的密码,用这个密码来解密,  
    51.                                           --取得私钥,再用私钥来解密被加密的文本  
    52.                                           --此参数为nvarchar类型,所以字符串前要加N  
    53.                  )  
    54.               as varchar(100)  
    55.            )  
    56. from dbo.booksellerbankrouting  
    57.   
    58.   
    59.   
    60. --6.删除非对称密钥,如果已经用非对称密钥建了数据,那么不可以删除,否则数据会无法解密  
    61. drop asymmetric key asymKey1  


    4、对称密钥加密

    证书和非对称密钥使用数据库级内部的公钥来加密,并且使用数据库级内部的私钥来解密。对称密钥相对简单,包含了一个同时用来加密和解密的密钥,所以对称密钥加密数据更快,并且用在大数据集时更加合适。

    [sql] view plain copy
     
    1. --1.1创建非对称密钥  
    2. create asymmetric key asymSymkey  
    3. with  algorithm = RSA_512  
    4. ENCRYPTION BY PASSWORD ='12345ABCDE'  
    5.   
    6. /*====================================================  
    7.   
    8. 对称密钥可以使用的加密算法包括:  
    9.     des,desx,triple_des,triple_des_3key,  
    10.     rc2,rc4,  
    11.     aes_128,aes_192,aes_256  
    12.       
    13. 需要用:非对称密钥、其他对称密钥、证书、密码 来加密对称密钥  
    14. ======================================================*/  
    15. --1.2创建对称密钥,这里用非对称密钥来加密对称密钥  
    16. CREATE symmetric key symKey  
    17. with algorithm = triple_des  
    18. encryption by asymmetric key asymSymKey  
    19.   
    20.   
    21. --2.查看对称密钥  
    22. select name,  
    23.        symmetric_key_id,  
    24.        key_length,  
    25.        algorithm_desc   
    26.   
    27. from sys.symmetric_keys  
    28.   
    29.   
    30. --3.修改对称密钥加密方式,原来是用非对称密钥来加密的,现在改为用密码加密  
    31. --3.1打开对称密钥  
    32. open symmetric key symKey  
    33. decryption by asymmetric key asymSymkey  
    34. with password = '12345ABCDE'  --这儿的解密密码是非对称密钥的私钥的加密密码  
    35.                               --先用这个密码解密,取得私钥  
    36.                               --然后用这个私钥解密,取得对称密钥  
    37.   
    38. --3.2先增加密码  
    39. alter symmetric key symKey  
    40. add encryption by password = 'ABCDE12345'  
    41.   
    42. --3.3再删除非对称密钥加密,如果先删除非对称密钥加密,  
    43. --会报错:无法删除 非对称密钥'asymSymKey'所创建的加密  
    44. alter symmetric key symKey  
    45. drop encryption by asymmetric key asymSymKey  
    46.   
    47.   
    48. close symmetric key symKey  
    49.   
    50.   
    51.   
    52. --4.用对称密钥加密  
    53. create table ttt  
    54. (id int not null primary key,   
    55.  Question varchar(300) not null,  
    56.  Answer varbinary(200) not null  
    57. )  
    58.   
    59. --4.1先打开对称密钥  
    60. open symmetric key symKey  
    61. decryption by password = 'ABCDE12345'  
    62.   
    63.   
    64. --4.2添加数据  
    65. insert into ttt  
    66. values(1,  
    67.        'what is your name?',  
    68.        ENCRYPTBYKEY(key_guid('symKey'), --对称密钥的guid  
    69.                     'abcdefg'           --需要加密的文本  
    70.                    )  
    71.       )  
    72.   
    73. --4.3关闭对称密钥  
    74. close symmetric key symKey  
    75.   
    76.   
    77.   
    78. --5.用对称密钥解密  
    79. --5.1先打开对称密钥  
    80. open symmetric key symKey  
    81. decryption by password = 'ABCDE12345'  
    82.   
    83.   
    84. --5.2显示解密数据  
    85. select ttt.id,  
    86.        ttt.Question,  
    87.        ttt.Answer,  
    88.        cast(DECRYPTBYKEY(Answer) as varchar(200)) --解密函数不需要对称密钥的guid  
    89. from ttt  
    90.   
    91.   
    92. --5.3关闭对称密钥  
    93. close symmetric key symKey  
    94.   
    95.   
    96.   
    97. --6.删除对称密钥  
    98. drop symmetric key symKey  

    5、证书加密

    证书包含密钥对(公钥和私钥)、证书拥有者的信息、证书可用的开始和结束过期日期。

    证书的公钥用来加密数据,私钥用来解密数据。SQL Server可以生成证书,也可以从外部文件或程序集载入。由于可以备份证书,然后从文件载入,所以证书比非对称密钥更容易迁移,而非对称密钥则不能这样,所以多用户数据库可以方便的重用一个证书。

    证书和非对称密钥加密都提供了一种非常安全的加密数据的方式,但是这种强度很高的加密方式也带来了较大的性能消耗,使用证书或非对称加密非常大的数据集,可能会对运行环境产生很大的开销,而使用对称密钥相对的开销较低。

    [sql] view plain copy
     
    1. --1.1创建证书  
    2. create certificate certEncrypt   
    3. encryption by password = 'cert12345'  
    4. with subject = 'encryption certificate',  
    5.      start_date = '2012-10-01',  
    6.      expiry_date = '2012-10-31'  
    7.   
    8.   
    9. --1.2.1创建数据库主密钥       
    10. create master key   
    11. encryption by password = 'excel12345'  
    12.   
    13.   
    14. --1.2.2不提供密码时,会自动用数据库主密钥来加密私钥  
    15. create certificate certEncrypt1  
    16. with subject = 'encryption certificate',  
    17.      start_date = '2012-10-01',  
    18.      expiry_date = '2012-10-31'  
    19.   
    20.   
    21. --1.2.3删除证书,然后才可以删除数据库主密钥,否则会报错  
    22. drop certificate certencrypt1  
    23.   
    24. drop master key  
    25.   
    26.   
    27.   
    28. --2.查看证书信息  
    29. select name,  
    30.        certificate_id,  
    31.        pvt_key_encryption_type_desc,--对私钥加密方式的说明  
    32.        is_active_for_begin_dialog,  --对于当前会话,是否启用了证书加密  
    33.        issuer_name,                 --证书颁发者的名称  
    34.        subject,                     --证书的主题  
    35.        start_date,  
    36.        expiry_date,  
    37.        pvt_key_last_backup_date     --上一次导出证书的私钥的日期和时间  
    38. from sys.certificates  
    39.   
    40.   
    41.   
    42. --3.备份证书  
    43. --备份证书时用于加密私钥的密码与对证书的私钥进行加密的密码,不是同一个密码  
    44. backup certificate certEncrypt  
    45. to file = 'c:certEncrypt.bak'   --证书的备份文件  
    46. with private key   
    47. (  
    48.  file = 'c:certEncrypt_privateKey.bak',--私钥文件  
    49.  decryption by password = 'cert12345',  --这个密码是在创建证书时指定的,  
    50.                                         --用于在备份密钥之前对私钥进行解密的密码  
    51.        
    52.  encryption by password = 'encryptCert123456'--在解密取得私钥后,  
    53.                                              --在将密钥写入私钥的备份文件之前,  
    54.                                              --对私钥进行加密的密码  
    55. )  
    56.   
    57.   
    58.   
    59. --4.还原证书  
    60. --4.1先删除证书,这样才能重建证书  
    61. drop certificate certEncrypt  
    62.   
    63.   
    64. --4.2然后从证书备份文件和私钥文件中,再次创建证书  
    65. create certificate certEncrypt  
    66. from file = 'c:certEncrypt.bak'   
    67. with private key   
    68. (  
    69.  file = 'c:certEncrypt_privateKey.bak',  
    70.  decryption by password = 'encryptCert123456',  --用于解密私钥文件中的私钥的密码  
    71.  encryption by password = 'cert12345'           --用于加密私钥的密码  
    72. )  
    73.   
    74.   
    75.   
    76. --5.管理证书的私钥  
    77. --5.1删除私钥的密码,这样默认通过数据库主密钥对私钥进行加密  
    78. alter certificate certEncrypt  
    79. remove private key  
    80.   
    81.   
    82. --5.2通过备份的私钥文件,为已经存在的证书重新增加私钥的密码  
    83. alter certificate certencrypt  
    84. with private key  
    85. (  
    86.  file = 'c:certEncrypt_privateKey.bak',  
    87.  decryption by password = 'encryptCert123456',  
    88.  encryption by password = 'cert12345'  
    89. )  
    90.   
    91.   
    92. --5.3修改私钥的密码  
    93. alter certificate certencrypt  
    94. with private key  
    95. (  
    96.  decryption by password = 'cert12345',  
    97.  encryption by password = '12345cert'  
    98. )  
    99.   
    100.   
    101.   
    102. --6.使用证书加密,解密  
    103. create table t  
    104. (id int not null primary key,  
    105.  question varchar(100) not null,  
    106.  answer varbinary(200) not null)  
    107.   
    108. --6.1加密数据  
    109. insert into t  
    110. values(1,  
    111.        'who are you?',  
    112.        ENCRYPTBYCERT(  
    113.                       cert_id('certencrypt'),  --证书的id  
    114.                       'kaka'                   --需要加密的文本  
    115.                     )  
    116.       )  
    117.   
    118. --6.2直接查看,发现是乱码  
    119. select ID,  
    120.        question,  
    121.        answer,  
    122.        CAST(answer AS varchar(200))  
    123. from t  
    124.   
    125.   
    126. --6.3解密,显示正确数据  
    127. select ID,  
    128.        question,  
    129.        answer,  
    130.        CAST(DECRYPTBYCERT(  
    131.                    cert_id('certencrypt'),  
    132.                    answer,  
    133.                    N'12345cert'    --私钥的密码,用来解密取得私钥,再用私钥来解密数据  
    134.                   ) AS varchar(200)  
    135.             )  
    136. from t  
    137.   
    138.   
    139.   
    140. --7.使用对称密钥执行解密,而该对称密钥则使用非对称密钥进行自动解密  
    141. create table tx  
    142. (id int not null primary key,  
    143.  question varchar(100) not null,  
    144.  answer varbinary(200) not null)  
    145.   
    146.   
    147. --7.1非对称密钥的私钥用数据库主密钥加密  
    148. --7.1.1创建数据库主密钥  
    149. create master key   
    150. encryption by password = 'excel12345'  
    151.   
    152.   
    153. --7.1.2创建非对称密钥,自动用数据库主密钥加密私钥  
    154. create asymmetric key asymKey  
    155. with algorithm = RSA_512  
    156.   
    157.   
    158. --7.1.3创建对称密钥,用非对称加密的私钥来加密对称密钥  
    159. CREATE symmetric key symKey  
    160. with algorithm = TRIPLE_DES  
    161. ENCRYPTION BY asymmetric key asymKey  
    162.   
    163.   
    164. --7.1.4打开对称密钥  
    165. open symmetric key symKey  
    166. decryption by asymmetric key asymKey  
    167.   
    168.   
    169. --7.1.5用对称密钥加密  
    170. insert into tx  
    171. values(1,  
    172.        'who are you?',  
    173.        ENCRYPTBYKEY(KEY_GUID('symKey'),  
    174.                     'kk')  
    175.        )  
    176.   
    177. --7.1.6关闭对称密钥  
    178. close symmetric key symKey  
    179.   
    180.   
    181. --7.1.7由于非对称加密的私钥是由数据库主密钥加密的,所以不需要提供私钥的密码,  
    182. --首先用数据库主密钥解密,取得非对称加密的私钥,  
    183. --然后用私钥解密,取得对称加密的公钥,用公钥解密被加密的文本  
    184. select id,  
    185.        question,  
    186.        answer,  
    187.        cast(DecryptBykeyAutoAsymkey(  
    188.                     asymkey_id('asymKey'), --用于保护对称密钥的非对称密钥的ID  
    189.                     null,                  --用于保护非对称密钥私钥的密码  
    190.                                            --如果私钥受数据库主密钥保护,则该值可以是 NULL  
    191.                     answer  
    192.                    )  
    193.                as varchar)  
    194. from tx  
    195.   
    196. delete from tx  
    197.   
    198.   
    199. --7.1非对称密钥的私钥用密码来加密  
    200. --7.2.1创建非对称密钥  
    201. create asymmetric key asymKey1  
    202. with algorithm = RSA_512  
    203. encryption by password = 'asymKey123456'  
    204.   
    205.   
    206. --7.2.2创建对称密钥,用非对称加密的私钥来加密对称密钥  
    207. CREATE symmetric key symKey1  
    208. with algorithm = TRIPLE_DES  
    209. ENCRYPTION BY asymmetric key asymKey1  
    210.   
    211.   
    212. --7.2.3打开对称密钥  
    213. open symmetric key symKey1  
    214. decryption by asymmetric key asymKey1  
    215. with password = 'asymKey123456'    --非对称密钥的私钥的密码  
    216.   
    217.   
    218. --7.2.4用对称密钥加密  
    219. insert into tx  
    220. values(1,  
    221.        'who are you?',  
    222.        ENCRYPTBYKEY(KEY_GUID('symKey1'),  
    223.                     'kk')  
    224.        )  
    225.   
    226. --7.2.5关闭对称密钥  
    227. close symmetric key symKey1  
    228.   
    229.   
    230. --7.2.6提供非对称加密的私钥的密码,首先用这个密码来解密,取得私钥,  
    231. --然后用私钥解密,取得对称加密的公钥,用公钥解密被加密的文本  
    232. select id,  
    233.        question,  
    234.        answer,  
    235.        cast(DecryptBykeyAutoAsymkey(  
    236.                     asymkey_id('asymKey1'),--用于保护对称密钥的非对称密钥的ID  
    237.                     N'asymKey123456',      --保护非对称密钥私钥的密码,类型为nvarchar  
    238.                                            --如果私钥受数据库主密钥保护,则该值可以是 NULL  
    239.                     answer  
    240.                    )  
    241.                as varchar)  
    242. from tx  
    243.   
    244. delete from tx  
    245.   
    246.   
    247. --7.3用证书的私钥用密码来加密  
    248. --7.3.1创建证书  
    249. create certificate certEncrypt1   
    250. encryption by password = 'cert12345'  
    251. with subject = 'encryption certificate',  
    252.      start_date = '2012-10-01',  
    253.      expiry_date = '2012-10-31'  
    254.   
    255.   
    256. --7.3.2创建对称密钥,用证书的私钥来加密对称密钥  
    257. CREATE symmetric key symKey11  
    258. with algorithm = TRIPLE_DES  
    259. ENCRYPTION BY certificate certEncrypt1  
    260.   
    261.   
    262. --7.3.3打开对称密钥  
    263. open symmetric key symKey11  
    264. decryption by certificate certEncrypt1  
    265. with password = 'cert12345'    --非对称密钥的私钥的密码  
    266.   
    267.   
    268. --7.3.4用对称密钥加密  
    269. insert into tx  
    270. values(1,  
    271.        'who are you?',  
    272.        ENCRYPTBYKEY(KEY_GUID('symKey11'),  
    273.                     'kk')  
    274.        )  
    275.   
    276. --7.3.5关闭对称密钥  
    277. close symmetric key symKey11  
    278.   
    279.   
    280. --7.3.6提供证书的私钥的密码,首先用这个密码来解密,取得私钥,  
    281. --然后用私钥解密,取得对称加密的公钥,用公钥解密被加密的文本  
    282. select id,  
    283.        question,  
    284.        answer,  
    285.        cast(DecryptBykeyAutoCert(  
    286.                  cert_id('certEncrypt1'),--用于保护对称密钥的证书的ID  
    287.                  N'cert12345',           --保护证书的私钥的密码,类型为nvarchar  
    288.                                          --如果私钥受数据库主密钥保护,则为NULL  
    289.                  answer  
    290.               )  
    291.              as varchar)  
    292. from tx  
    293.   
    294.   
    295. --8.删除证书  
    296. drop certificate certEncrypt  

    6、透明数据加密

    SQL Server 2008引入了透明数据加密,称为TDE,运行不修改应用程序的代码来完整的加密数据库文件。当用户数据库可用,并且启用了TDE时,数据写入磁盘时会在页级别进行加密,当数据读入内存时进行解密。

    如果数据文件或数据库备份丢失,那么如果没有用于加密DEK的服务器证书,数据库是不可以被还原或者正常的附加到其他SQL Server实例上的。

    如果需要正常的将一个数据库从一个实例上移动到另一个实例上,那么可以备份服务器级别的证书,并且在另一个实例上创建这个证书,这样就可以还原TDE的备份或者附加数据文件和日志文件了

    [sql] view plain copy
     
      1. --1.打开主数据库,这样才能创建服务器级别的证书  
      2. use master  
      3. go  
      4.   
      5.   
      6. --可以生成下面的密码  
      7. select NEWID()  
      8.   
      9. --2.创建数据库主密钥  
      10. create master key   
      11. encryption by password = '123A4C23-DDA2-437A-A320-FF3B787E3B8B'  
      12.   
      13.   
      14.   
      15. --3.1创建服务器级别的证书,用数据库主密钥来加密证书的私钥  
      16. create certificate TDE_SERVER_CERTIFICATE  
      17. with subject = 'Server-level certificate for TDE'  
      18.   
      19.   
      20. --3.2备份服务器级别的证书,由于这个证书是用数据库主密码加密的,  
      21. --所以在备份时,证书的私钥由数据库主密钥自动解密,在备份到私钥文件时,必须进行再次加密  
      22. --如果没有备份私钥文件,没有加密密码,会使得从备份创建的证书无法解密  
      23. backup certificate TDE_SERVER_CERTIFICATE  
      24. to file ='c:TDE_SERVER_CERTIFICATE.bak'  
      25. with private key  
      26. (  
      27.  file = 'c:TDE_SERVER_CERTIFICATE_private_key.bak',  
      28.  encryption by password = '123456789abcedfg'   --用来加密证书私钥的密码  
      29. )  
      30.   
      31.   
      32. --3.3删除服务器级别的证书  
      33. drop certificate TDE_SERVER_CERTIFICATE  
      34.   
      35.   
      36. --3.4从备份创建服务器证书  
      37. create certificate TDE_SERVER_CERTIFICATE  
      38. from file ='c:TDE_SERVER_CERTIFICATE.bak'  
      39. with private key  
      40. (  
      41.   file = 'c:TDE_SERVER_CERTIFICATE_private_key.bak',  
      42.   decryption by password = '123456789abcedfg'   --用来解密证书私钥的密码  
      43. )  
      44.   
      45.   
      46.   
      47. --打开需要启用透明数据加密的数据库  
      48. use excel  
      49. go  
      50.   
      51. --4.创建以透明方式加密数据库的加密密钥  
      52. --DEK是用来加密整个数据库的加密密钥  
      53. create database encryption key  
      54. with algorithm = TRIPLE_DES_3KEY  --AES_128 | AES_192 | AES_256 | TRIPLE_DES_3KEY   
      55. encryption by server certificate TDE_SERVER_CERTIFICATE  
      56.   
      57.   
      58. --5.启用加密  
      59. alter database excel  
      60. set encryption on  
      61.   
      62.   
      63. --6.验证数据库是否真正加密  
      64. select name,  
      65.        is_encrypted  
      66. from sys.databases  
      67. where database_id = DB_ID()  
      68.   
      69.   
      70.   
      71. --7.1修改DEK密钥的算法强度  
      72. alter database encryption key  
      73. regenerate with algorithm = AES_128  
      74.   
      75.   
      76. --7.2返回所有数据库中相关DEK状态的信息  
      77. select DB_NAME(database_id),  
      78.        case encryption_state  
      79.             when 0 then 'no encryption'  
      80.             when 1 then 'unencrypted'  
      81.             when 2 then 'encryption in progress'  
      82.             when 3 then 'encrypted'  
      83.             when 4 then 'key change in progress'  
      84.             when 5 then 'decryption in progress'  
      85.        end encryption_state,  
      86.          
      87.        key_algorithm,  
      88.        key_length  
      89.                  
      90. from sys.dm_database_encryption_keys  
      91.   
      92.   
      93.   
      94. --8.1创建一个新的服务器级证书  
      95. use master  
      96. go  
      97.   
      98. create certificate TDE_SERVER_CERTIFICATE_X  
      99. with subject = 'Server-level certificate for TDE X'  
      100.   
      101.   
      102. USE wc  
      103. GO  
      104.   
      105. --8.2修改加密DEK的服务器级证书  
      106. alter database encryption key  
      107. encryption by server certificate TDE_SERVER_CERTIFICATE_X  
      108.   
      109.   
      110.   
      111. --9.1从数据库中移除TDE  
      112. alter database excel  
      113. set encryption off  
      114.   
      115.   
      116. --9.2删除DEK  
      117. drop database encryption key  
  • 相关阅读:
    Java小案例——对字符串进行加密解密
    Java基础——使用三元运算符判断一个数的奇偶性
    Java基础——字母大小写转换
    多线程实现——新龟兔赛跑
    编程面试题之——简答题(持续更新...)
    多线程之——共享数据
    多线程之——线程的状态
    Android 8.0 Oreo介绍
    Android 7.0 Nougat介绍
    Android 6.0 Marshmallow介绍
  • 原文地址:https://www.cnblogs.com/findumars/p/5549906.html
Copyright © 2020-2023  润新知