MSSQL - 最佳实践 - 如何打码隐私数据列
ccwork 2024-11-09 11:30 24 浏览
摘要
在SQL Server安全系列专题月报分享中,我们已经分享了:如何使用对称密钥实现SQL Server列加密技术、使用非对称密钥加密方式实现SQL Server列加密、使用混合密钥实现SQL Server列加密技术、列加密技术带来的查询性能问题以及相应解决方案和行级别安全解决方案这五篇文章,文章详情可以参见往期月报。本期月报我们分享使用SQL Server 2016 dynamic data masking实现隐私数据列的打码技术最佳实践。
问题引入
在平日的生活中,我们或多或少都经历过广告推销、电话诈骗,不厌其烦,甚至更为严重到银行卡号泄漏、身份证号泄漏等更为严重的情况。这个时候,于是我们就在想有没有技术手段来尽量或最大限度的保护我们隐私数据安全呢?答案是肯定的,SQL Server 2016版本首次引入了dynamic data masking来实现隐私数据列的打码技术,让我们一起来看看如何实现类似于手机号、身份证号、驾照号等隐私数据打码技术。
原理分析
数据列打码技术的本身我们并不陌生,就是将一些比较私密的数据信息隐藏起来,仅开放给有较高权限的用户查看完整数据。打码技术本身并不会对数据做任何的加密、解密等操作。严格意义上讲,数据打码不是一个完整的数据安全解决方案,但是它可以作为安全策略中重要的一环来有效避免用户隐私数据列的泄漏。让我们一起来看看在SQL Server 2016 dynamic data masking是如何实现的。
实现方法
创建测试数据库
为了测试方便,我们专门创建了测试数据库TestDb。
--Step 1 - Create MSSQL sample database
USE master
GO
IF DB_ID('TestDb') IS NULL
CREATE DATABASE [TestDb];
GO
创建测试表
首先,我们创建一张常规表CustomerInfo,来存放客户信息,其中,CustomerPhone列为用户隐私数据,存放了用户的手机号码。
--Step 2 - Create Test Table, init records
USE [TestDb]
GO
IF OBJECT_ID('dbo.CustomerInfo', 'U') IS NOT NULL
DROP TABLE dbo.CustomerInfo
CREATE TABLE dbo.CustomerInfo
(
CustomerId INT IDENTITY(10000,1) NOT NULL PRIMARY KEY,
CustomerName VARCHAR(100) NOT NULL,
CustomerPhone CHAR(11) NOT NULL
);
-- Init Table
INSERT INTO dbo.CustomerInfo
VALUES ('CustomerA','13402872514')
,('CustomerB','13880674722')
,('CustomerC','13487759293')
GO
创建测试用户
为了方便观察和检查测试效果,我们创建一个测试账号DemoUser。
-- Step3: Create a DemoUser to test
USE [TestDb]
GO
CREATE USER DemoUser WITHOUT LOGIN;
GRANT SELECT ON dbo.CustomerInfo TO DemoUser;
GO
EXECUTE AS USER = 'DemoUser';
-- Verify data
SELECT *
FROM dbo.CustomerInfo
REVERT
常规情况下,测试账号,可以清清楚楚,明明白白看到用户所有数据,包含客户手机号这种关键的隐私数据。如果,这个用户有不轨之心是非常容易将这些信息泄漏、导出的,安全风险较大。
客户手机号打码
于是,我们想,如果能够将客户隐私数据,比如,电话号码(身份证号码、银行卡号等)打码的话,那么测试账号就无法查看到用户完整的数据信息了。打码方法如下:
-- Step4: Alter phone column add data mask
USE [TestDb]
GO
ALTER TABLE dbo.CustomerInfo
ALTER COLUMN CustomerPhone ADD MASKED WITH(FUNCTION='partial(3, "****", 4)');
由于CustomerPhone是11位数字,我们使用partial方法打码隐藏中间四位,打码符号使用星号,保留前三位和后四位数数字即可。
查询打码列
打码完毕,我们使用系统试图查看打码列和打码函数:
-- Step5. Query system view to check data mask
SELECT
db_name() as database_name,
SCHEMA_NAME(schema_id) AS schema_name,
tbl.name as table_name,
c.name as column_name,
c.is_masked,
c.masking_function
FROM sys.masked_columns AS c WITH (NOLOCK)
INNER JOIN sys.tables AS tbl WITH(NOLOCK)
ON c.[object_id] = tbl.[object_id]
WHERE c.is_masked = 1
AND tbl.name = 'CustomerInfo';
从结果可以看到我们已经将表TestDb.dbo.CustomerInfo中字段CustomerPhone打码,打码函数为partial(3, "**", 4),结果展示如下所示:
测试用户查看数据
打码完毕后,再次使用DemoUser测试账号查看打码后的数据:
-- Step6: Demo user to query and verify data
USE [TestDb]
GO
EXECUTE AS USER = 'DemoUser';
-- Verify data
SELECT *
FROM dbo.CustomerInfo
REVERT
从查询结果展示来看,客户手机号码列中间四位已经成功打码了,测试账号已经无法获取到完整的客户电话号码了。
修改打码符号
有时候,有的人会说,我不喜欢星号,能否换个打码姿势,我更喜欢使用字母X。只要你喜欢,随便切换,方法如下:
-- Step7: What if I want to change the mask sign from * to X
USE [TestDb]
GO
ALTER TABLE dbo.CustomerInfo
ALTER COLUMN CustomerPhone CHAR(11) MASKED WITH(FUNCTION='partial(3, "XXXX", 4)');
现在打码符号变成了X,展示如下:
新增隐私打码列
现在我们需要增加一个新的列,用来存放用户email地址,也请同时打码。非常简单,新增列的时候使用email打码函数即可,如下所示:
-- Step8: and I want to add a new email mask column
ALTER TABLE dbo.CustomerInfo
ADD Email varchar(100) MASKED WITH (FUNCTION = 'email()') NOT NULL DEFAULT('demo.user@test.com')
查询打码列特定值
有的人可能会问,手机号码被打码了,这个列会影响我的WHERE语句查询吗?当然不会,因为data mask技术本身并没有对数据做任何修改,只是在展示的时候,打码隐藏掉部分信息而已。
-- Step9: Demo user to query the specified phone customer info
USE [TestDb]
GO
EXECUTE AS USER = 'DemoUser';
-- Verify data
SELECT *
FROM dbo.CustomerInfo
WHERE CustomerPhone = '13880674722'
REVERT
查询结果展示,手机号码和email地址始终被打码。
拷贝存在打码列的表
我们说data mask技术并没有加密、修改数据本身。到目前为止,测试账号DemoUser已经无法获取到客人的关键隐私数据了,那么他能够将用户数据Copy、导出吗?让我们做一个简单的测试,DemoUser将表CustomerInfo复制到一个新表CustomerInfo_copied中:
-- Step10: Ops, if I copy a new table from the data masked table, I can't get the unmasked data now.
USE [TestDb]
GO
GRANT CREATE TABLE TO DemoUser;
GRANT ALTER ON SCHEMA::dbo TO DemoUser;
EXECUTE AS USER = 'DemoUser';
-- Verify data
SELECT *
INTO dbo.CustomerInfo_copied
FROM dbo.CustomerInfo
REVERT
GRANT SELECT ON dbo.CustomerInfo_copied TO DemoUser;
EXECUTE AS USER = 'DemoUser';
SELECT * FROM dbo.CustomerInfo_copied
REVERT
DemoUser复制了客户信息数据到新表后,查看新表中的数据,依然是被打码的,测试用户无法导出、复制客人的隐私数据。达到了安全策略保护客户隐私数据的目的,展示结果如下:
我想要在无码的世界
如果有一天DemoUser成了高权限用户,确实需要查看客户隐私数据列,这个时候,我们可以给予测试账号unmask的权限,他就可以看到完整的客户数据了。方法如下:
-- Step 11: But, how can demo user to query the unmasked data?
USE TestDB
GO
GRANT UNMASK TO DemoUser;
EXECUTE AS USER = 'DemoUser';
SELECT * FROM dbo.CustomerInfo;
REVERT;
-- Removing the UNMASK permission
REVOKE UNMASK TO DemoUser;
此时,DemoUser查询到的数据,是非常完整的客人数据。
删掉打码
删除打码,让所有用户回归无码的世界。
-- Step 12: all the demos have been done, it's time to drop the mask.
USE TestDB
GO
ALTER TABLE dbo.CustomerInfo
ALTER COLUMN CustomerPhone DROP MASKED;
最后总结
本期月报我们分享了使用SQL Server 2016引入的新特性dynamic data masking实现客户数据打码技术,防止未授权用户查看、导出用户关键隐私数据,最大限度保证用户数据安全性。
作者:风移
相关推荐
- 用过 Spring Boot Admin 才知道,原来监控还能这么丝滑!
-
如果你是一个后端,那你就应该知道SpringBootActuator绝对是项目上线前后不可或缺的好帮手。它就像是在你代码旁边放了一个“智能体检仪”,可以帮你随时看看项目的健康状况、内存消耗、线程...
- 视频监控网络健康需评估延时、丢包、抖动、带宽、稳定性五大指标
-
在视频监控系统中,网络通信的稳定性直接影响视频流的实时性、清晰度和可靠性。除了延时和丢包外,还需关注以下关键指标:一、核心网络指标1.网络延时(Latency)定义:数据从摄像头传输到...
- 曼联继续奥斯梅恩谈判,担心其高薪令B费不满!中锋签谁举棋未定
-
曼联被曝仍然对那不勒斯租借给加拉塔萨雷的奥斯梅恩感兴趣,「TEAMtalk」的意大利足球记者鲁迪·加莱蒂称,红魔仍然保持直接与奥斯梅恩经纪人的联系。不过,红魔想要买奥斯梅恩,就必须获得欧冠资格。这不是...
- 惊天逆转!掘金逆袭雷霆,戈登三分绝杀让对手心碎
-
5月6日,北京时间的NBA季后赛西部半决赛舞台上,掘金队客场挑战雷霆队,上演了一场惊心动魄的对决。掘金队不仅完成了14分的大逆转,更由戈登在比赛最后时刻投中三分绝杀,最终以121-119险胜雷霆,总比...
- 曝切尔西已告知退货桑乔,曼联欲2000万卖勒沃库森!滕哈格恐阻碍
-
英国《每日镜报》称,曼联已经从切尔西处得到消息,蓝军将在本赛季结束后放弃买断桑乔,宁可赔付500万英镑将他送回老特拉福德。25岁的英格兰边锋去年以租借形式加盟切尔西一个赛季,恩佐·马雷斯卡的球队可以选...
- 曼联与库尼亚达成一致,下周正式加盟!当面会晤德拉普争取第二签
-
曼联已经基本谈妥了马特乌斯·库尼亚的转会,25岁的巴西前锋将成为夏季重建的第一签。意大利转会专家法布里济奥·罗马诺证实,红魔与库尼亚的个人协议已经达成;而英国天空体育则披露了这笔交易正式完成的时间,就...
- 曼联求购2500万转世齐达内恐被拒!零吸引力,遭调侃明年提前保级
-
德国天空体育报道称,曼联希望签下里昂的法国天才拉扬·谢尔基,后者在欧联杯四分之一决赛两回合都攻破了红魔的球门。据称,吉姆·拉特克里夫爵士的转会团队已经与里昂进行过谈判。由于其合同即将到期,2500万欧...
- 为什么作为一个程序员都应该写博客?
-
几乎每一个程序员都听说过写博客会有很多好处,但真的动手去写的却很少。其中有一个很重要的原因就是,有些人心里会认为:我不是大牛,写出来的博客没意义。有这种心理很正常,只是每个人表现出来的方式不太一样,有...
- 中考数学怎样发挥出色的水平(中考数学怎么超常发挥)
-
考场上能超常发挥,肯定是每个同学和家长所向往的,那如何做到超常发挥呢?下面就和优教网http://www.ujiao.net/article-17345-1.html小编一起来看看中考数学怎样发挥出色...
- 曼联4-1逆转双杀,与热刺决赛争冠!芒特2球复活增阿莫林欧冠希望
-
曼联在老特拉福德4-1逆转击败毕尔巴鄂竞技,两回合双杀对手,总比分7-1挺进本赛季欧联杯决赛。5月22日周四凌晨3点,红魔将重返毕尔巴鄂圣马梅斯球场,与同样来自英超的热刺争夺欧联杯冠军和下赛季欧冠资格...
- 博客音乐播放器Hype Machine:喂饱你的耳朵
-
音乐聚合网站hypem.com的官网应用,专门用于跟踪世界各大音乐博客中的音乐资源,用于让用户更好地发现各类音乐或者新的艺人。喂饱你的耳朵HypeMachine不仅仅是一个音乐播放器,还是一个用来寻...
- 半场87分破纪录!雷霆用实力说话,总冠军稳了?
-
北京时间5月8日,NBA季后赛西部半决赛第二场,一场焦点之战吸引了全球球迷的目光,俄克拉荷马雷霆坐镇主场,迎战卫冕冠军丹佛掘金。原本被视作势均力敌的较量,却在半场时就失去了悬念,雷霆以摧枯拉朽之势,打...
- 人物阅读素材:邓紫棋--做最优秀和努力的自己
-
做最优秀和努力的自己晨阳偌大的舞台中央,一个女孩,一头卷发,一袭飘逸的白色上衣,优美的旋律中,她正投入地唱着:谁知道我们该去向何处,谁明白生命已变为何物,是否找个借口继续苟活,或是展翅高飞保持愤怒,我...
- 神奇!不需要服务器,搭建免费个人Blog,so easy
-
随着年龄越来越大,记忆力越来越差了,有时候看到一篇好的文章,哪怕你是点击了收藏,当需要这个技术点的时候,你是不是还得去回忆一下那篇收藏的文章放到什么地方,是那个论坛上面的?今日就教大家如何建立自己的知...
- 坎特:梅西是遇到过最难对付的对手 我超喜欢我的Mini Cooper
-
直播吧10月29日讯近日在接受切尔西球迷问答时,坎特回答提问时表示梅西是自己遇到最难对付的对手,队内最有趣的球员是若日尼奥。现在不考虑交易自己的minicooper。谁是你遇到过最难对付的球员?坎...
- 一周热门
- 最近发表
- 标签列表
-
- copy命令 (86)
- 电脑基本常识 (77)
- 客户端身份校验失败 (83)
- 算法导论 (92)
- 图片放大 (80)
- ftp服务器怎么用 (81)
- 使用通配符 (81)
- 蜂鸣器程序 (76)
- 工厂方法模式 (76)
- resultsetmetadata (78)
- 开机运行命令 (82)
- node js安装linux (81)
- out of memory是什么意思 (85)
- shellexecuteinfo (75)
- dos常用命令 (82)
- 单元测试 (77)
- txt文本编辑器 (81)
- c语言从入门到精通 (80)
- 批量修改图片大小 (94)
- raid1 (82)
- beanutils copyproperties (80)
- 443端口 (79)
- nullreferenceexception (97)
- eclipse下载 (89)
- coreldraw视频教程 (77)