国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - T-SQL問題解決集錦 數據加解密全集

T-SQL問題解決集錦 數據加解密全集

2019-12-17 14:48黃釗吉 Sql Server

對于一些敏感數據,如密碼、卡號,一般不能使用正常數值來存儲。否則會有安全隱患。以往的加密解密都有前端應用程序來輔助完成。而數據庫一般只能加密不能解密

以下代碼已經在SQLServer2008上的示例數據庫測試通過

問題一:如何為數據進行加密與解密,避免使用者竊取機密數據? 
對于一些敏感數據,如密碼、卡號,一般不能使用正常數值來存儲。否則會有安全隱患。以往的加密解密都有前端應用程序來輔助完成。而數據庫一般只能加密不能解密。 

從2005開始提供了數據庫層面的數據加密與解密。其實現方式主要有以下: 

1、 利用CONVERT改變編碼方式: 
利用該函數把文字或數據轉換成VARBINARY。但該方式不具備保護數據的能力,僅避免瀏覽數據的過程中能直接看到敏感數據的作用。 

2、 利用對稱密鑰: 
搭配EncryptByKey進行數據加密。使用DecryptByKey函數進行解密。這種方式比較適合大數據量。因為對稱密鑰的過程好用資源較少。 

3、 利用非對稱密鑰: 
搭配EncryptByAsymKey進行數據加密。使用DecryptByAsymKey函數進行解密。用于更高安全級別的加解密數據。因為耗用資源叫多。 

4、 利用憑證的方式: 
搭配EncryptByCert進行加密和DecryptByCert函數進行解密。比較類似非對稱密鑰。 

5、 利用密碼短語方式: 
搭配EncryptBypassPhrase進行加密,使用DecryptByPassPhrase函數來解密。可以使用有意義的短語或其他數據行,當成加密、解密的關鍵字,比較適合一般的數據加解密。 


案例: 
1、 Convert方式: 

復制代碼代碼如下:


a) USE tempdb 
b) GO 
c) CREATE TABLE test 
d) ( 
e) userID INT IDENTITY(1, 1) , 
f) userName VARCHAR(10) , 
g) userSalary FLOAT , 
h) cyberalary NVARCHAR(MAX) 
i) ) ; 
j) 
k) INSERT INTO TEST 
l) ( userName, userSalary ) 
m) VALUES ( 'taici', 1234 ), 
n) ( 'hailong', 3214 ), 
o) ( 'meiyuan', 1111 ) 
p) --ALTER TABLE test 
q) --ADD userNewSalary VARBINARY(512) 
r) --使用轉換函數把數據轉換成varbinary,改變編碼方式。 
s) SELECT * , 
t) CONVERT(VARBINARY(512), userSalary) 
u) FROM test 
v) --把數據轉換成int,可以恢復原有編碼方式 
w) SELECT * , 
x) CONVERT(INT, userSalary) 
y) FROM test 


2、對稱密鑰: 

復制代碼代碼如下:


a) --創建對稱密鑰 
b) USE AdventureWorks 
c) GO 
d) CREATE SYMMETRIC KEY SymKey123 
e) WITH ALGORITHM=TRIPLE_DES ENCRYPTION BY PASSWORD='P@ssw0rd' 
f) GO 
g) --注意事項:在啟用時,需要先OPEN SYMMETRIC KEY 搭配密鑰密碼,否則所產生的數據都會是null值。而且需要搭配Key_GUID函數來使用 
h) --打開對稱密鑰 
i) OPEN SYMMETRIC KEY SymKey123 DECRYPTION BY PASSWORD='P@ssw0rd'; 
j) --進行數據加密 
k) SELECT * ,ENCRYPTBYKEY(KEY_GUID('SymKey123'),CONVERT(VARCHAR(max),AddressLine1)) 
l) FROM Person.Address 
m) 
n) --檢查加密后長度,利用datalength()函數 
o) SELECT DATALENGTH(ENCRYPTBYKEY(KEY_GUID('SymKey123'),CONVERT(VARCHAR(MAX ),AddressLine1))) 
p) FROM Person.Address 
q) GO 
r) --把加密后數據更新到原來另外的列上 
s) UPDATE Person.Address 
t) SET AddressLine2=ENCRYPTBYKEY(KEY_GUID('SymKey123'),CONVERT(VARCHAR(max),AddressLine1)) 
u) --解密:解密過程同樣需要OPEN SYMMETRIC KEY ,且需要利用DECRYPTBYKEY 和CONVERT函數 
v) OPEN SYMMETRIC KEY SymKey123 DECRYPTION BY PASSWORD='P@ssw0rd'; 
w) 
x) SELECT AddressID,CONVERT(VARCHAR(MAX ) ,CONVERT (VARCHAR(MAX ),DECRYPTBYKEY(AddressLine2))) 
y) FROM Person.Address 


3、非對稱密鑰: 

復制代碼代碼如下:


a) --非對稱密鑰使用兩種不同的密鑰,所以加密是是不需要輸入密碼驗證,但解密時就需要 
b) USE AdventureWorks 
c) GO 
d) CREATE ASYMMETRIC KEY AsymKey123 WITH ALGORITHM=RSA_2048 ENCRYPTION BY PASSWORD='P@ssw0rd'; 
e) GO 
f) 
g) --添加新列存儲加密后的數據 
h) ALTER TABLE Person.Address ADD AddressLine3 nvarchar(MAX) 
i) GO 
j) --進行加密 
k) SELECT *,ENCRYPTBYASYMKEY(ASYMKEY_ID ('AsymKey123'),CONVERT(VARCHAR(MAX ),AddressLine1)) 
l) FROM Person.Address 
m) GO 
n) 
o) --把數據更新到一個新列 
p) UPDATE Person.Address 
q) SET AddressLine3=ENCRYPTBYASYMKEY(ASYMKEY_ID ('AsymKey123'),CONVERT(VARCHAR(MAX ),AddressLine1)) 
r) 
s) 
t) SELECT *--addressline3 
u) FROM Person.Address 
v) 
w) --解密:此過程一定要使用密碼來解密,此處的類型要與加密時相同,比如加密時用varchar,而這里用nvarchar的話是解密不了的。 
x) SELECT TOP 10 AddressID,CONVERT(VARCHAR(MAX),CONVERT (VARCHAR(MAX ),DECRYPTBYASYMKEY(ASYMKEY_ID('AsymKey123'),AddressLine3,N'P@ssw0rd'))) AS Decryptedata 
y) FROM Person.Address 


4、證書加密: 

復制代碼代碼如下:


a) --證書加密:首先建立證書(certificate) 
b) CREATE CERTIFICATE certKey123--證書名 
c) ENCRYPTION BY PASSWORD='P@ssw0rd'--密碼 
d) WITH SUBJECT='Address Certificate',--證書描述 
e) START_DATE='2012/06/18',--證書生效日期 
f) EXPIRY_DATE='2013/06/18' ;--證書到期日 
g) GO 
h) --利用證書加密 
i) SELECT *,ENCRYPTBYCERT(CERT_ID('certKey123'),CONVERT (VARCHAR(MAX ),AddressLine1)) cyberAddress 
j) FROM Person.Address 
k) 
l) --添加新列存放加密數據 
m) ALTER TABLE Person.Address ADD AddressLine4 Nvarchar(MAX ) 
n) 
o) --把加密后數據放到新列 
p) UPDATE Person.Address 
q) SET AddressLine4=ENCRYPTBYCERT(CERT_ID('certKey123'),CONVERT (VARCHAR(MAX ),AddressLine1)) 
r) 
s) --解密 
t) SELECT AddressID,CONVERT(VARCHAR(MAX ),CONVERT(VARCHAR(MAX ),DECRYPTBYCERT(CERT_ID('certKey123'),AddressLine4,N'P@ssw0rd'))) DecryAddress 
u) FROM Person.Address 


5、短語加密: 

復制代碼代碼如下:


a) --短語加密:該過程較為簡單,只需要使用EncryptByPassPhrase函數,使用短語加密時,參考的數據航不可以變動,否則解密失敗。 
b) SELECT *,AddressLine5=ENCRYPTBYPASSPHRASE('P@ssw0rd',CONVERT(varbinary,AddressLine1),AddressID) 
c) FROM Person.Address 
d) 
e) --添加新列存放數據,注意,ENCRYPTBYPASSPHRASE函數返回的是VARBINARY類型 
f) ALTER TABLE Person.Address ADD AddressLine5 VARBINARY(256) 
g) 
h) --將數據更新,過程中使用P@ssw0rd和AddressID數據行當成密碼短語 
i) 
j) UPDATE Person.Address 
k) SET AddressLine5=ENCRYPTBYPASSPHRASE('P@ssw0rd',CONVERT(varbinary,AddressLine1),AddressID) 
l) 
m) SELECT * FROM Person.Address 



問題二:如何保護數據庫對象定義,避免發生過渡暴露敏感信息? 

一般的保護措施是在創建對象時使用WITH ENCRYPTION來把對象加密,這樣就無法查看定義。但是問題是對于維護來說就成了問題,而且備份還原時這部分對象是會丟失的。 

其中一個解決方法是把定義語句放到對象的【擴展屬性】中保存,這樣能解決上面的問題。 

下面舉個例子: 

復制代碼代碼如下:


--1、建立已加密的存儲過程 
USE AdventureWorks 
GO 
CREATE PROC test 
WITH ENCRYPTION 
AS 
SELECT SUSER_SNAME() , 
USER_NAME() 
GO 
--2、將上述定義內容去除,利用短語加密搭配EncryptByPassPhrase函數加密,然后在用sys.sp_addextendedproperty存儲過程,指定一個擴展名稱。 
USE AdventureWorks 
GO 
DECLARE @sql VARCHAR(MAX) 
SET @sql = 'CREATE PROC Test WITH ENCRYPTION AS SELECT suer_sname(),user_name() GO' 

--3、將內容加密后轉換成sql_variant數據類型 
DECLARE @bsql SQL_VARIANT 
SET @bsql = ( SELECT CONVERT(SQL_VARIANT, ENCRYPTBYPASSPHRASE('P@ssw0rd', 
CONVERT(VARCHAR(MAX), @sql))) 


--4、新增到指定存儲過程的擴展屬性中: 
EXEC sys.sp_addextendedproperty @name = N'test定義', @value = N'System.Byte[]', 
@level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'PROCEDURE', 
@level1name = N'test' 
GO 
EXEC sys.sp_addextendedproperty @name = N'代碼內容', 
@value = N'CREATE PROC Test WITH ENCRYPTION AS SELECT suer_sname(),user_name() GO', 
@level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'PROCEDURE', 
@level1name = N'test' 
GO 

--5、還原 
DECLARE @pwd VARCHAR(100)= 'P@ssw0rd' 
--密碼短語 

DECLARE @proc VARCHAR(100)= 'test' 
--存儲過程名 

DECLARE @exName NVARCHAR(100)= '代碼內容' 
--擴充屬性名 


--將原本結果查詢 
SELECT value 
FROM sys.all_objects AS sp 
INNER JOIN sys.extended_properties AS P ON P.major_id = sp.object_id 
AND P.minor_id = 0 
AND P.class = 1 
WHERE ( P.name = @exName ) 
AND ( ( sp.type = N'p' 
OR sp.type = N'rf' 
OR sp.type = 'pc' 

AND ( sp.name = @proc 
AND SCHEMA_NAME(sp.schema_id) = N'dbo' 



問題三、如何讓指定用戶可以對數據表進行Truncate操作? 

Truncate在對大表全刪除操作時,會明顯比Delete語句更快更有效,但是因為它不需要存放日志,并且一定是全表刪除,所以造成數據的不可恢復性。也說明了它的危險性。 
但是,執行Truncate需要有表擁有者、系統管理員、db_owner、db_ddladmin這些里面的其中一種高權限角色才能執行。 
對此,可以使用05之后的EXECUTE AS表達式來實現權限內容的切換: 

1. 切換登錄:EXECUTE AS LOGIN 

2. 切換用戶:EXECUTE AS USER 

3. 切換執行權限:EXECUTE AS owner/'user name',利用高用戶權限來執行作業。此步驟可以在低權限實體下執行高權限操作,也能避免安全性漏洞。 

另外,只有EXECUTE AS Caller可以跨數據庫執行,而其他方式進行的權限切換僅限制于本數據庫。 

注意:執行EXECUTE AS USER模擬使用者切換時,需要先獲得被模擬用戶的授權。 

可以使用REVERT來還原執行內容前的原始身份。 


問題四、如何獲取前端連接的信息,如IP地址和計算機名? 

對于DBA工作或者某些特殊的應用程序,需要獲取前端應用的系統信息。而這些信息如果用用戶表來存儲,代價會比直接讀取數據庫系統信息要大。所以建議適當讀取系統表: 

在連接數據庫的session期間,都可以在master數據庫中找到session信息,但是從05開始,有了很多DMV/DMF來實現這些功能: 

l Master.dbo.sysprocesses或者master.sys.sysprocesses:提供執行階段的SPID、計算機名、應用程序名等。 

l Sys.dm_exec_sessions:記錄每個session的基本信息,包括id、計算機名、程序名、應用程序名等 

l Sys.dm_exec_connections:記錄每個連接到SQLServer實例的前端信息,包括網絡位置、連接時間等等。 

l select client_net_address 'Client IP Address',local_net_address 'SQL ServerIP Address',* 

l from sys.dm_exec_connections 

l where session_id=@@spid 

在2005以后,建議使用DMV取代系統表。

問題五、如何避免SQL注入的攻擊? 

對于數據庫應用程序,無論是那種DBMS,SQL注入都是一大隱患。 

要避免SQL注入,應該最起碼做到以下幾點: 

1. 檢查輸入的數據,應用程序不要相信用戶輸入的數據,必須經過檢驗后才能輸入數據庫。要排除%、--等特殊符號。 

2. 避免果度暴露錯誤信息。建議可以轉換成Windows事件或者是轉換成應用程序內部錯誤信息。 

3. 使用參數化查詢或者存儲過程 

注意: 
動態SQL是導致SQL注入的主兇 

作者: 黃釗吉

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91网在线观看 | 日韩欧美手机在线 | 国产视频1区 | 国产亚洲精品美女久久久久久久久久 | 日韩精品视频在线 | 免费的av电影| 亚洲性视频 | 免费视频黄 | 亚洲一区中文字幕在线观看 | 免费精品人在线二线三线区别 | 久久久九九| 欧美 日韩 | 久久久成人免费 | 国产精品久久久久久久久久免费看 | 日韩三级电影免费观看 | 高清久久| 成年网站视频 | 免费国产网站 | 成人福利免费在线观看 | 一区二区三区在线播放 | 国产精品久久久久精 | 国产精品成人国产乱一区 | 中文字幕高清在线观看 | 国产精品久久久久久久久久 | 日韩一区二区免费电影 | 黄色日本视频 | 亚色成人 | 99视频在线免费 | av集中淫 | 亚洲在线 | 玖玖玖影院 | 成人午夜精品久久久久久久蜜臀 | 色婷婷综合久色 | 日本中文在线 | 91av免费在线观看 | 日韩精品99久久久久中文字幕 | 欧美成人影院 | 欧美一区二区三区在线播放 | 精品无码久久久久国产 | 美女黄网 | 色视在线 |