有時候啊,當我們存放在資料庫裡面的數據,需要明文存放,但是對於前臺查詢出來的,又不太希望明文放出去的時候(比方說客戶的手機啊,郵箱啊)之類有點敏感的信息,之前通常是保存個明文,然後在前臺展現的時候再特殊處理一下,然後就ok了。 而現在呢,在2016提供了data mask的功能,可以遮掩對應列的一些 ...
有時候啊,當我們存放在資料庫裡面的數據,需要明文存放,但是對於前臺查詢出來的,又不太希望明文放出去的時候(比方說客戶的手機啊,郵箱啊)之類有點敏感的信息,之前通常是保存個明文,然後在前臺展現的時候再特殊處理一下,然後就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 all
11 select 'sixgod','godsixzhao','00834123642','[email protected]'
12
13 select * from t2
14
15 ID Name PWD Phone Email
16 ----------- -------------------------------------------------- -------------------- -------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
17 1 張三 zhangsan 12433281924 zhangsan@qq.com
18 2 李四 wojiaolisi 18734612309 lisi@sohu.com
19 3 王五 wangwu 15378198234 wangwu@21cn.com
20 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 t2 ID Name PWD Phone Email ----------- -------------------------------------------------- -------------------- -------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 張三 xxxx 12433281924 zhangsan@qq.com 2 李四 xxxx 18734612309 lisi@sohu.com 3 王五 xxxx 15378198234 wangwu@21cn.com 4 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 t2 ID Name PWD Phone Email ----------- -------------------------------------------------- -------------------- -------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 7952 張三 xxxx 1243****1924 zXXX@XXXX.com 7601 李四 xxxx 1873****2309 lXXX@XXXX.com 5583 王五 xxxx 1537****8234 wXXX@XXXX.com 3190 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 User revoke unmask from User
只要有unmask這個許可權,那麼就可以看到原始數據啦~~~
PS:可以查看那些列有mask 的哦
select object_name(object_id),name,masking_function from sys.masked_columns (無列名) name masking_function t2 ID random(1000, 9999) t2 PWD default() t2 Phone partial(4, "****", 4) t2 Email email()