標籤:
有時候啊,當我們存放在資料庫裡面的資料,需要明文存放,但是對於前台查詢出來的,又不太希望明文放出去的時候(比方說客戶的手機啊,郵箱啊)之類有點敏感的資訊,之前通常是儲存個明文,然後在前台展現的時候再特殊處理一下,然後就ok了。
而現在呢,在2016提供了data mask的功能,可以遮掩對應列的一些基礎資訊
事不宜遲,先做範例
1 create table t2(ID int identity,Name nvarchar(50),PWD varchar(20),Phone varchar(50),Email varchar(200)) 2 3 go 4 insert into t2 (Name ,PWD ,Phone ,Email ) 5 select ‘張三‘,‘zhangsan‘,‘12433281924‘,‘[email protected]‘ 6 union all 7 select ‘李四‘,‘wojiaolisi‘,‘18734612309‘,‘[email protected]‘ 8 union all 9 select ‘王五‘,‘wangwu‘,‘15378198234‘,‘[email protected]‘10 union all11 select ‘sixgod‘,‘godsixzhao‘,‘00834123642‘,‘[email protected]‘12 13 select * from t214 15 ID Name PWD Phone Email16 ----------- -------------------------------------------------- -------------------- -------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------17 1 張三 zhangsan 12433281924 zhangsan@qq.com18 2 李四 wojiaolisi 18734612309 lisi@sohu.com19 3 王五 wangwu 15378198234 wangwu@21cn.com20 4 sixgod godsixzhao 00834123642 sixgod@qq.com
測試表搭建
然後我們對這個表的某個列進行mask 的操作。比方說我們對密碼進行一個mask 可以使用以下語句
alter table t2 alter column PWD add masked with (function=‘default()‘)然後我建立來一個使用者Test1 然後只對他授予一個查詢的許可權。運行如下execute as login=‘Test1‘select * from t2ID Name PWD Phone Email----------- -------------------------------------------------- -------------------- -------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1 張三 xxxx 12433281924 zhangsan@qq.com2 李四 xxxx 18734612309 lisi@sohu.com3 王五 xxxx 15378198234 wangwu@21cn.com4 sixgod xxxx 00834123642 sixgod@qq.com
預設的方法,是將整個列的替換成XXXX來顯示。(僅僅在查詢的時候會變成這樣,資料並沒有真正修改成 XXXX)。這是一種mask 的方法。
2016提供給了4種mask 的方式,上面已經示範來一種,還有3種分別是 email(),ramdom(),Custom masking 這3種,下面就示範一下
alter table t2 alter column Email add masked with (function=‘Email()‘)alter table t2 alter column ID add masked with (function=‘Random(1000,9999)‘)alter table t2 alter column Phone add masked with (function=‘partial(4,"****",4)‘)select * from t2ID Name PWD Phone Email----------- -------------------------------------------------- -------------------- -------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------7952 張三 xxxx 1243****1924 zXXX@XXXX.com7601 李四 xxxx 1873****2309 lXXX@XXXX.com5583 王五 xxxx 1537****8234 wXXX@XXXX.com3190 sixgod xxxx 0083****3642 sXXX@XXXX.com
2、Email() 這個函數只顯示email 的第一位以及 @,其他全部使用X來Mask
3、Random(1000,9999) 顯示的值從1000~9999 之間產生的隨機整數進行mask
4、partial 相當於自訂mask 模式,格式 (首碼保留位元,mask串,尾碼保留位元) 這個格式進行建立
那是不是加來mask之後就無法看到未經處理資料呢?並不是的,是需要使用許可權進行控制
grant unmask to Userrevoke unmask from User
只要有unmask這個許可權,那麼就可以看到未經處理資料啦~~~
PS:可以查看那些列有mask 的哦
select object_name(object_id),name,masking_function from sys.masked_columns(無列名) name masking_functiont2 ID random(1000, 9999)t2 PWD default()t2 Phone partial(4, "****", 4)t2 Email email()
sql server 裡面的 dynamic Data Masking