SQL Server 2008中的代碼安全(六) 對(duì)稱(chēng)密鑰加密
證書(shū)和非對(duì)稱(chēng)密鑰使用數(shù)據(jù)庫(kù)級(jí)的內(nèi)部公鑰加密數(shù)據(jù),并且使用數(shù)據(jù)庫(kù)級(jí)內(nèi)部私鑰解密數(shù)據(jù)。而對(duì)稱(chēng)密鑰相對(duì)簡(jiǎn)單,它們包含一個(gè)同時(shí)用來(lái)加密和解密的密鑰。困此,使用對(duì)稱(chēng)密鑰加密數(shù)據(jù)更快,并且用在大數(shù)據(jù)時(shí)更加合適。盡管復(fù)雜度是考慮使用它的因素,但它仍然是一個(gè)很好的加密數(shù)據(jù)的選擇。
我們看一組例子:
示例一、創(chuàng)建對(duì)稱(chēng)密鑰
對(duì)稱(chēng)密鑰的特性是:在數(shù)據(jù)庫(kù)會(huì)話(huà)中使用它對(duì)數(shù)據(jù)進(jìn)行加密和解密前必須首先打開(kāi)。
創(chuàng)建對(duì)稱(chēng)密鑰使用如下命令:CREATE SYMMETRIC KEY 創(chuàng)建對(duì)稱(chēng)密鑰。(http://msdn.microsoft.com/en-us/library/ms188357.aspx)
use DB_Encrypt_Demo
go
-- 創(chuàng)建一個(gè)用于加密對(duì)稱(chēng)密鑰的非對(duì)稱(chēng)密鑰
CREATE ASYMMETRIC KEY symDemoKey --名稱(chēng)
WITH ALGORITHM = RSA_512 --加密算法
ENCRYPTION BY PASSWORD = 'TestSYM456!'--密碼
-- 創(chuàng)建一個(gè)對(duì)稱(chēng)密鑰
CREATE SYMMETRIC KEY sym_Demo
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY ASYMMETRIC KEY symDemoKey
示例二、查看當(dāng)前數(shù)據(jù)庫(kù)中的對(duì)稱(chēng)密鑰
使用目錄視圖sys.symmetric_keys(http://msdn.microsoft.com/en-us/library/ms189446.aspx)來(lái)查看。
--查看當(dāng)前數(shù)據(jù)庫(kù)中的非對(duì)稱(chēng)密鑰
use DB_Encrypt_Demo
go
SELECT name, algorithm_desc FROM sys.symmetric_keys
----結(jié)果返回
/*
name algorithm_desc
sym_Demo TRIPLE_DES
*/
示例三、修改非對(duì)稱(chēng)密鑰的加密方式
你可以使用ALTER SYMMETRIC KEY(http://technet.microsoft.com/en-us/library/ms189440.aspx)命令修改對(duì)稱(chēng)密鑰的加密方式。但執(zhí)行前必須使用OPEN SYMMETRIC KEY(http://msdn.microsoft.com/en-us/library/ms190499.aspx)命令打開(kāi)它。
use DB_Encrypt_Demo
go
--先用私鑰密碼打開(kāi)對(duì)稱(chēng)密鑰
OPEN SYMMETRIC KEY sym_Demo
DECRYPTION BY ASYMMETRIC KEY symDemoKey
WITH PASSWORD = 'TestSYM456!'
--打開(kāi)之后,先增加密碼加密,取代原密鑰
ALTER SYMMETRIC KEY sym_Demo
ADD ENCRYPTION BY PASSWORD = 'newnew!456'
--再刪除非對(duì)稱(chēng)密鑰加密
ALTER SYMMETRIC KEY sym_Demo
DROP ENCRYPTION BY ASYMMETRIC KEY symDemoKey
--完成操作后,關(guān)閉對(duì)稱(chēng)密鑰
CLOSE SYMMETRIC KEY sym_Demo
示例四、使用對(duì)稱(chēng)密鑰對(duì)數(shù)據(jù)進(jìn)行加密和解密。
1、為了使用對(duì)稱(chēng)密鑰對(duì)數(shù)據(jù)進(jìn)行加密,必須首先打開(kāi)它,然后使用函數(shù)EncryptByKey 加密數(shù)據(jù)。(http://msdn.microsoft.com/zh-cn/library/ms174361.aspx)
2、使用DecryptByKey來(lái)解密使用對(duì)稱(chēng)密鑰加密的數(shù)據(jù)。注意DecryptByKey不像甩EncryptByKey,無(wú)須使用對(duì)稱(chēng)密鑰GUID。因此,為了解密,必須打開(kāi)正確的對(duì)稱(chēng)密鑰會(huì)話(huà),否則會(huì)顯示null。
下面是一個(gè)例子:
/****************************3w@live.cn***********************/
USE DB_Encrypt_Demo
GO
--創(chuàng)建測(cè)試數(shù)據(jù)表,用于對(duì)稱(chēng)加密
CREATE TABLE dbo.PWDQuestion
(CustomerID int NOT NULL PRIMARY KEY,
PasswordHintQuestion nvarchar(300) NOT NULL,
PasswordHintAnswer varbinary(200) NOT NULL)
GO
--插入加密數(shù)據(jù)
OPEN SYMMETRIC KEY sym_Demo
DECRYPTION BY PASSWORD = 'newnew!456'
INSERT dbo.PWDQuestion
(CustomerID, PasswordHintQuestion, PasswordHintAnswer)
VALUES
(12, '您出生的醫(yī)院名稱(chēng)?',
EncryptByKey(Key_GUID('sym_Demo '), '杭州市一'))
CLOSE SYMMETRIC KEY sym_Demo
查看未加密的數(shù)據(jù):
--解密數(shù)據(jù)
OPEN SYMMETRIC KEY sym_Demo
DECRYPTION BY PASSWORD = 'newnew!456'
SELECT CustomerID,PasswordHintQuestion,
CAST(DecryptByKey(PasswordHintAnswer) as varchar(200)) PasswordHintAnswer
FROM dbo.PWDQuestion
WHERE CustomerID = 12
--打開(kāi)后切記關(guān)閉!??!3w@live.cn
CLOSE SYMMETRIC KEY sym_Demo

--不打開(kāi)直接讀取
SELECT CustomerID,PasswordHintQuestion,
CAST(DecryptByKey(PasswordHintAnswer) as varchar(200)) PasswordHintAnswer
FROM dbo.PWDQuestion
WHERE CustomerID = 12

至此,好像已經(jīng)大功告成了,別,千萬(wàn)別高興得太早!
這里有個(gè)問(wèn)題,如果惡意用戶(hù)不知道CustomerID=13的PasswordHintAnswer列的真實(shí)值,但知道CustomerID=14的PasswordHintAnswer列的真實(shí)值,則完全可以通過(guò)惡意替換PasswordHintAnswer列而繞過(guò)加密??!3w@live.cn此時(shí),我們索性連CustomerID列作為驗(yàn)證列也一起加密,以絕后患 !
注意:加密的驗(yàn)證列也可以由另一個(gè)相關(guān)表的列作為參數(shù)傳入。
看一個(gè)完整的例子:
truncate table dbo.PWDQuestion
go
--添加兩個(gè)未加密的行
INSERT dbo.PWDQuestion
(CustomerID, PasswordHintQuestion, PasswordHintAnswer)
select 13, '您出生的醫(yī)院名稱(chēng)?',cast('浙江婦保院' as varbinary)
union all
select 14, '您出生的醫(yī)院名稱(chēng)?',cast('浙江婦保二院' as varbinary)
--打開(kāi)對(duì)稱(chēng)密鑰,連CustomerID列一起加密
OPEN SYMMETRIC KEY sym_Demo
DECRYPTION BY PASSWORD = 'newnew!456'
UPDATE dbo.PWDQuestion
SET PasswordHintAnswer =
EncryptByKey(Key_GUID('sym_Demo'),
PasswordHintAnswer,1,--1表示使用驗(yàn)證器值
CAST(CustomerID as varbinary))
WHERE CustomerID in (13,14)
--打開(kāi)后切記關(guān)閉!??!3w@live.cn
CLOSE SYMMETRIC KEY sym_Demo
--此時(shí)必須這樣查看原數(shù)據(jù)
OPEN SYMMETRIC KEY sym_Demo
DECRYPTION BY PASSWORD = 'newnew!456'
SELECT CustomerID,PasswordHintQuestion,
CAST(DecryptByKey(PasswordHintAnswer, 1,--1表示使用驗(yàn)證器值
CAST(CustomerID as varbinary)) as varchar(200)) PasswordHintAnswer
FROM dbo.PWDQuestion
WHERE CustomerID = 13
--打開(kāi)后切記關(guān)閉?。?!3w@live.cn
CLOSE SYMMETRIC KEY sym_Demo
惡意替換開(kāi)始:
/**********************************************************
--我們用剛才的CustomerID = 13的PasswordHintAnswer列值
--替換CustomerID = 14的PasswordHintAnswer列值,
--再用剛才讀取14的方法讀取真實(shí)值
**********************************************************/
update dbo.PWDQuestion set PasswordHintAnswer=
(select PasswordHintAnswer from dbo.PWDQuestion where CustomerID = 14)
where CustomerID = 13
此時(shí),我們?cè)俨榭矗?
OPEN SYMMETRIC KEY sym_Demo
DECRYPTION BY PASSWORD = 'newnew!456'
SELECT CustomerID,PasswordHintQuestion,
CAST(DecryptByKey(PasswordHintAnswer, 1,--1表示使用驗(yàn)證器值
CAST(CustomerID as varbinary)) as varchar(200)) PasswordHintAnswer,
PasswordHintAnswer as binaryValue
FROM dbo.PWDQuestion
WHERE CustomerID in(13,14)
--打開(kāi)后切記關(guān)閉?。?!3w@live.cn
CLOSE SYMMETRIC KEY sym_Demo
郎勒個(gè)郎!爽吧!雖然復(fù)制了相同的二進(jìn)制數(shù)據(jù),可是讀取結(jié)果令攻擊者大失所望??!
示例五、刪除對(duì)稱(chēng)密鑰
命令:DROP SYMMETRIC KEY 刪除指定的對(duì)稱(chēng)密鑰( http://technet.microsoft.com/en-us/library/ms182698.aspx)
例子:
DROP SYMMETRIC KEY symDemoKey
注意:如果加密密鑰打開(kāi)沒(méi)有關(guān)閉,則drop失敗。
小結(jié):
1、本文主要介紹對(duì)稱(chēng)密鑰的創(chuàng)建、刪除、查看以及用它來(lái)修改加密方式、進(jìn)行數(shù)據(jù)的加密和解密。
2、對(duì)稱(chēng)密鑰的特性是:在數(shù)據(jù)庫(kù)會(huì)話(huà)中使用它對(duì)數(shù)據(jù)進(jìn)行加密和解密前必須首先打開(kāi)。
3、對(duì)稱(chēng)密鑰可用于大數(shù)據(jù)的加密。
下文將主要介紹證書(shū)加密(Certificate Encryption)
相關(guān)文章
sql server 2008數(shù)據(jù)庫(kù)連接字符串大全
這篇文章主要介紹了sql server 2008數(shù)據(jù)庫(kù)的連接字符串大全,需要的朋友可以參考下2014-03-03
SQL Server 2008數(shù)據(jù)庫(kù)設(shè)置定期自動(dòng)備份的方法
這篇文章主要給大家介紹了關(guān)于SQL Server 2008數(shù)據(jù)庫(kù)設(shè)置定期自動(dòng)備份的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL Server2008具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-11-11
數(shù)據(jù)庫(kù)日常維護(hù)常用的腳本概述及部分測(cè)試
今天花點(diǎn)時(shí)間在SQL SERVER 2008中運(yùn)行試試常用的數(shù)據(jù)庫(kù)維護(hù)腳本,結(jié)果發(fā)現(xiàn)以前從書(shū)本上見(jiàn)過(guò)的backup語(yǔ)句和dump語(yǔ)句已經(jīng)在2008里面消失了,感興趣的你可不要錯(cuò)過(guò)了哈,經(jīng)驗(yàn)之談啊,希望可以幫助到你2013-02-02
SQL Server 2008中的數(shù)據(jù)表壓縮功能詳細(xì)介紹
這篇文章主要介紹了SQL Server 2008中的數(shù)據(jù)表壓縮功能詳細(xì)介紹,介紹了為何使用數(shù)據(jù)壓縮、數(shù)據(jù)壓縮的原理、數(shù)據(jù)壓縮注意事項(xiàng)等,需要的朋友可以參考下2014-08-08
SQL Server 2008登錄錯(cuò)誤:無(wú)法連接到(local)解決方法
在一些朋友安裝完SQL Server 2008之后大多會(huì)遇到連接出錯(cuò)的問(wèn)題比如:SQL Server 2008登錄錯(cuò)誤:無(wú)法連接到(local)等等相關(guān)問(wèn)題,本文將詳細(xì)介紹解決方法,需要的朋友可以參考下2012-12-12
Sql Server 2008R2升級(jí)Sql Server 2012圖文教程
這篇文章主要分享了了Sql Server 2008R2升級(jí)Sql Server 2012圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
安裝sql server 2008時(shí)的4個(gè)常見(jiàn)錯(cuò)誤和解決方法
這篇文章主要介紹了安裝sql server 2008時(shí)的常見(jiàn)錯(cuò)誤和解決方法,本文總結(jié)了4個(gè)可能問(wèn)題的問(wèn)題,并給出了相應(yīng)的解決方法,需要的朋友可以參考下2014-09-09
Sql server 2008 express遠(yuǎn)程登錄實(shí)例設(shè)置 圖文教程
Sql server 2008 express遠(yuǎn)程登錄實(shí)例設(shè)置 圖文教程,需要的朋友可以參考下。2011-11-11
關(guān)于SQL Server 2008忘記sa密碼修改sa密碼的方法圖解
這篇文章主要介紹了關(guān)于SQL Server 2008忘記sa密碼修改sa密碼的方法圖文詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01
sql2008評(píng)估期已過(guò)的解決辦法及序列號(hào)
sql2008評(píng)估期已過(guò)的解決辦法及序列號(hào),有關(guān)如何升級(jí)您的測(cè)試版軟件的信息2013-02-02

