SQLServer 2008中的代碼安全(四) 主密鑰
1、服務(wù)器主密鑰(Service Master Key),位于層次結(jié)構(gòu)的最頂端,并且在安裝SQL Server時(shí)自動(dòng)創(chuàng)建,用于加密系統(tǒng)數(shù)據(jù)、鏈接的服務(wù)器登錄名以及數(shù)據(jù)庫(kù)主密鑰。在第一次通過(guò)SQL Server使用服務(wù)主密鑰來(lái)加密證書、數(shù)據(jù)庫(kù)主密鑰或鏈接的服務(wù)器主密碼時(shí),服務(wù)主密鑰會(huì)自動(dòng)生成,并且使用SQL Server服務(wù)賬戶的Windows證書來(lái)生成它。如果必須改變SQL Server服務(wù)賬號(hào),微軟建議使用SQL Server配置管理器,因?yàn)檫@個(gè)工具將執(zhí)行生成新服務(wù)主密鑰需要的合適的解密和加密方法,而且可以使加密層次結(jié)構(gòu)保持完整。服務(wù)主密鑰也用于加密其下的數(shù)據(jù)庫(kù)主密鑰。
2、數(shù)據(jù)庫(kù)主密鑰(Database Master Key),用于加密證書,以及非對(duì)稱密鑰和對(duì)稱密鑰。所有數(shù)據(jù)庫(kù)都可以只包含一個(gè)數(shù)據(jù)庫(kù)主密鑰,在創(chuàng)建它時(shí),通過(guò)服務(wù)主密鑰對(duì)其加密。創(chuàng)建非對(duì)稱密鑰時(shí),可以決定在加密非對(duì)稱密鑰對(duì)應(yīng)的私鑰是否包含密碼。如果示包含密碼,將使用數(shù)據(jù)庫(kù)主密鑰來(lái)加密私鑰。
我們看一組例子:
示例一、備份及還原服務(wù)主密鑰
用到以下兩個(gè)sql命令:
BACKUP SERVICE MASTER KEY 導(dǎo)出服務(wù)主密鑰。(http://msdn.microsoft.com/zh-cn/library/ms190337.aspx)
RESTORE SERVICE MASTER KEY從備份文件中導(dǎo)入服務(wù)主密鑰。(http://msdn.microsoft.com/zh-cn/library/ms187972.aspx)
--以下語(yǔ)句備份服務(wù)主密鑰到C:\SqlBackup\SMK.bak
BACKUP SERVICE MASTER KEY
TO FILE = 'C:\SqlBackup\SMK.bak'
ENCRYPTION BY PASSWORD = 'MakeItAGoodOne!1AB'----注意該密碼可以使用單引號(hào)
go
--恢復(fù)服務(wù)主密鑰
RESTORE SERVICE MASTER KEY
FROM FILE = 'H:\SqlBackup\SMK.bak'
DECRYPTION BY PASSWORD = 'MakeItAGoodOne!1AB'
go
如果該密鑰沒(méi)有實(shí)際變化,而執(zhí)行密鑰恢復(fù)時(shí),會(huì)收到提示:
--The old and new master keys are identical. No data re-encryption is required.
示例二、創(chuàng)建、再生成和刪除數(shù)據(jù)庫(kù)主密鑰
用到以下兩個(gè)sql命令:
CREATE MASTER KEY 創(chuàng)建數(shù)據(jù)庫(kù)主密鑰(http://technet.microsoft.com/zh-cn/library/ms174382.aspx)
ALTER MASTER KEY 重新生成數(shù)據(jù)庫(kù)主密鑰(http://msdn.microsoft.com/en-us/library/ms186937%28SQL.90%29.aspx)
DROP MASTER KEY 刪除數(shù)據(jù)庫(kù)主密鑰(http://msdn.microsoft.com/en-us/library/ms180071.aspx)
當(dāng)數(shù)據(jù)庫(kù)主密鑰被顯式創(chuàng)建時(shí),會(huì)同時(shí)自動(dòng)生成一個(gè)額外生成的安全層,用于加密數(shù)據(jù)庫(kù)中的新證書和非對(duì)稱密鑰,更進(jìn)一步保護(hù)已加密的數(shù)據(jù)。
IF NOT EXISTS (SELECT name
FROM sys.databases
WHERE name = 'BookStore')
BEGIN
CREATE DATABASE BookStore
END
GO
USE BookStore
GO
--創(chuàng)建數(shù)據(jù)庫(kù)主密鑰
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
go
USE BookStore
GO
--重新生成數(shù)據(jù)庫(kù)主密鑰
ALTER MASTER KEY
[FORCE] REGENERATE WITH ENCRYPTION BY PASSWORD = 'password'
--刪除數(shù)據(jù)庫(kù)主密鑰
USE BookStore
GO
DROP MASTER KEY
注意:如果該數(shù)據(jù)庫(kù)主密鑰仍然被其他數(shù)據(jù)庫(kù)對(duì)象使用,則不能被刪除,這點(diǎn)與架構(gòu)類似。
同時(shí)一旦創(chuàng)建數(shù)據(jù)庫(kù)主密鑰,就立刻備份它是一個(gè)好的習(xí)慣。
示例三、備份、恢復(fù)一個(gè)數(shù)據(jù)庫(kù)主密鑰
語(yǔ)法:
BACKUP MASTER KEY導(dǎo)出服務(wù)主密鑰。(http://technet.microsoft.com/en-us/library/ms174387.aspx)
RESTORE MASTER KEY從備份文件中導(dǎo)入數(shù)據(jù)庫(kù)主密鑰。(http://msdn.microsoft.com/en-us/library/ms186336.aspx)
下面是一個(gè)完整示例:
--備份數(shù)據(jù)庫(kù)主密鑰
USE BookStore
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MagneticFields!'
GO
BACKUP MASTER KEY TO FILE = 'H:\SqlBackup\BookStore_Master_Key.BAK'
ENCRYPTION BY PASSWORD = '4D280837!!!'
--恢復(fù)數(shù)據(jù)庫(kù)主密鑰
RESTORE MASTER KEY FROM FILE = 'H:\SqlBackup\BookStore_Master_Key.BAK'
DECRYPTION BY PASSWORD = '4D280837!!!'
ENCRYPTION BY PASSWORD = 'MagneticFields!'
與服務(wù)主密鑰類似,如果沒(méi)有修改,則會(huì)收到如下提示:
The old and new master keys are identical. No data re-encryption is required.
示例三、從數(shù)據(jù)庫(kù)主密鑰刪除服務(wù)主密鑰
當(dāng)一個(gè)數(shù)據(jù)庫(kù)主密鑰被創(chuàng)建時(shí),它被默認(rèn)使用兩種方式加密:服務(wù)主密鑰和被使用CREATE MASTER KEY 命令中使用的密碼。如果你不想使用服務(wù)主密碼加密數(shù)據(jù)庫(kù)主密鑰(這種情況下,擁有sysadmin特權(quán)的login在不知道數(shù)據(jù)庫(kù)主密鑰的前提下將不能訪問(wèn)加密數(shù)據(jù)),你可以使用ALTER MASTER KEY 命令刪除服務(wù)主密鑰。
簡(jiǎn)略語(yǔ)法如下:
ALTER MASTER KEY
ADD ENCRYPTION BY SERVICE MASTER KEY |
DROP ENCRYPTION BY SERVICE MASTER KEY
由于服務(wù)主密鑰允許擁有足夠許可(如sysadmin)的用戶自動(dòng)使用數(shù)據(jù)庫(kù)主密鑰解密,因此,一旦刪除了服務(wù)主密鑰的加密,而再想修改數(shù)據(jù)庫(kù)主密鑰時(shí),你必須使用一個(gè)新的命令訪問(wèn)它。OPEN MASTER KEY, 語(yǔ)法如下:
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
下面是一個(gè)例子:
ALTER MASTER KEY DROP ENCRYPTION BY SERVICE MASTER KEY
--一旦執(zhí)行,任何數(shù)據(jù)庫(kù)主密鑰的修改需要使用OPEN MASTER KEY的口令訪問(wèn),這樣是為了重新應(yīng)用服務(wù)主密鑰的加密
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'MagneticFieldS!'
--一旦服務(wù)主密鑰被用于加密數(shù)據(jù)庫(kù)主密鑰,數(shù)據(jù)庫(kù)主密鑰不再需要被顯式打開或關(guān)閉。
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
--關(guān)閉數(shù)據(jù)庫(kù)主密鑰
CLOSE MASTER KEY
小結(jié):
1、本文主要介紹服務(wù)主密鑰的備份與還原,數(shù)據(jù)庫(kù)的主密鑰的創(chuàng)建、重新生成、刪除和備份、還原。
2、一旦創(chuàng)建主密鑰,立刻備份它是一個(gè)很好的習(xí)慣。
下文將主要介紹非對(duì)稱密鑰加密(Asymmetric Key Encryption)
相關(guān)文章
SQLServer2008提示評(píng)估期已過(guò)解決方案
這篇文章主要介紹了SQLServer2008提示評(píng)估期已過(guò)解決方案,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04SQL Server 2008 數(shù)據(jù)庫(kù)鏡像部署實(shí)例之二 配置鏡像,實(shí)施手動(dòng)故障轉(zhuǎn)移
上一篇文章已經(jīng)為配置鏡像數(shù)據(jù)庫(kù)做好了準(zhǔn)備,接下來(lái)就要進(jìn)入真正的配置階段2013-11-11SQL Server 2008 R2 超詳細(xì)安裝圖文教程
這篇文章主要介紹了SQL Server 2008 R2 超詳細(xì)安裝圖文教程,需要的朋友可以參考下2015-09-09SQL SERVER 2008 無(wú)法附加數(shù)據(jù)庫(kù)的解決方法
重裝SQL了之后,想把以前的數(shù)據(jù)庫(kù)附加上去,但是附加不了,錯(cuò)誤提示見(jiàn)上2011-12-12將DataTable作為存儲(chǔ)過(guò)程參數(shù)的用法實(shí)例詳解
需要向存儲(chǔ)過(guò)程中傳遞字符串,今天看了下SQL Server 2008的新特性,發(fā)現(xiàn)有表變量的使用,及其將DataTable作為參數(shù)的用法,下面與大家分享下2013-05-05SQLServer 2008中SQL增強(qiáng)之二 Top新用途
在SQL Server 2005之前的傳統(tǒng)SQL語(yǔ)句中,top語(yǔ)句是不支持局部變量的。2011-05-05sql?server?2008數(shù)據(jù)庫(kù)不能添加附加文件的解決方法
這篇文章主要介紹了sql?server?2008數(shù)據(jù)庫(kù)不能添加附加文件的解決方法,需要的朋友可以參考下2023-02-02SQL SERVER 2008數(shù)據(jù)庫(kù)日志文件收縮的方法
這篇文章主要為大家詳細(xì)介紹了SQL SERVER 2008數(shù)據(jù)庫(kù)日志文件收縮的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
今天在運(yùn)行sql server 2008時(shí)候提示不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表 的解決辦法2013-05-05