SQL Server 2016中的动态数据掩码

SQL Server2016是微软发布的一款功能强大的数据库管理系统,它提供了多种功能来增强数据和应用程序的安全性、维护性和检索性。其中,动态数据掩码是SQL Server 2016中新引入的一项重要安全特性,它能够保护敏感数据不被未授权的用户访问。本文将探讨动态数据掩码的工作原理以及如何应用这项技术来保护数据。

在早期,通常在应用程序端通过逻辑处理或在SQL Server端替换字符来掩码敏感数据,然后将掩码后的数据返回给应用程序。如果应用程序未能正确掩码数据,或者敏感数据在网络传输过程中被截获,或者所有具有SELECT权限的SQL Server用户仍可以访问未掩码的数据,那么这些情况下都存在风险。

动态数据掩码简介

动态数据掩码通过在查询结果集中动态地掩码指定数据库字段的敏感数据,从而限制了敏感数据的暴露,帮助防止未授权用户访问敏感数据。这项数据保护功能在查询结果集中隐藏了敏感数据,而数据库中的数据并未改变。

数据掩码技术

数据掩码是将原始数据用随机字符或数据隐藏起来的过程。常见的数据掩码技术包括:

  • 乱序:乱序字符的顺序。
  • 置空:用空字符替换值中的字符。
  • 替换:用替换表中的另一个值替换值。
  • 掩码:掩码全部数据或数据的选定部分。

这些技术可以被归类为三种类型:

  • 静态数据掩码:生产环境中原始数据被更改为掩码数据。
  • 即时数据掩码:从源复制数据并在目标上进行掩码。
  • 动态数据掩码:在运行时动态进行掩码。

MySQL和PostgreSQL中的数据掩码

截至目前,MySQL和PostgreSQL并没有内置的动态数据掩码功能。用户可能需要使用第三方工具或自定义脚本/函数来实现数据掩码。例如:

SELECT '***' AS PhoneNumber FROM `Employees` -- 输入: 1234567890 输出: *** SELECT REPEAT('*', CHAR_LENGTH(PhoneNumber) - 6) AS PhoneNumber FROM `Employees` -- 输入: 1234567890 输出: ********** SELECT CONCAT(SUBSTR(PhoneNumber, 1, 4), REPEAT('*', CHAR_LENGTH(PhoneNumber) - 4)) AS PhoneNumber FROM `Employees` -- 输入: 1234567890 输出: 1234****

SQL Server 2016中的动态数据掩码

SQL Server2016提供了四种掩码函数,用于在查询返回数据时以不同的方式掩码数据。

当希望掩码所有字符时,可以使用默认掩码函数。掩码字符和查询返回的掩码字符数量由以下逻辑确定:

  • 如果数据长度大于或等于4,则为XXXX(四个X)。
  • 对于数值数据类型,为0。
  • 对于二进制数据类型,为0。
  • 对于日期时间数据类型,为01/01/1900。
CREATE TABLE [dbo].[Employee] ( [SecretCode] VARCHAR(10) MASKED WITH (FUNCTION = 'default()'), -- 其他字段 ) ALTER TABLE [dbo].[Employees] ALTER COLUMN [SecretCode] ADD MASKED WITH (FUNCTION = 'default()')

使用表变量来检查这些功能:

DECLARE @Employees AS TABLE ( SecretCode VARCHAR(10) MASKED WITH (FUNCTION = 'default()'), NetSalary MONEY MASKED WITH (FUNCTION = 'default()'), DateOfBirth DATETIME MASKED WITH (FUNCTION = 'default()') ) INSERT INTO @Employees SELECT 'ABCDEFGHIJ', 80000, '1990-05-21' SELECT * FROM @Employees

结果:

SecretCode NetSalary DateOfBirth
xxxx 0.00 1900-01-01 00:00:00.000

注意:需要以非管理员用户身份检查此内容,因为管理员用户有权查看所有数据。如果使用管理员用户执行此操作,将看不到任何差异。

它部分掩码电子邮件地址的字符。值得注意的是,它掩码字符以及电子邮件地址的长度,使得从显示的字符中预测电子邮件地址变得不可能。

DECLARE @Employees AS TABLE ( SecretCode VARCHAR(10) MASKED WITH (FUNCTION = 'default()'), NetSalary MONEY MASKED WITH (FUNCTION = 'default()'), DateOfBirth DATETIME MASKED WITH (FUNCTION = 'default()'), EmailID VARCHAR(50) MASKED WITH (FUNCTION = 'email()') ) INSERT INTO @Employees SELECT 'ABCDEFGHIJ', 80000, '1990-05-21', 'suvendugiri@mydomain.in' SELECT * FROM @Employees

结果:

SecretCode NetSalary DateOfBirth EmailID
xxxx 0.00 1900-01-01 00:00:00.000 sXXX@XXXX.com

它根据函数的自定义输入掩码数据。它部分掩码数据。需要向掩码函数传递三个参数:前缀、填充和后缀。

DECLARE @Employees AS TABLE ( SecretCode VARCHAR(10) MASKED WITH (FUNCTION = 'default()'), NetSalary MONEY MASKED WITH (FUNCTION = 'default()'), DateOfBirth DATETIME MASKED WITH (FUNCTION = 'default()'), EmailID VARCHAR(50) MASKED WITH (FUNCTION = 'email()'), FullName VARCHAR(50) MASKED WITH (FUNCTION = 'partial(2,"***",2)') ) INSERT INTO @Employees SELECT 'ABCDEFGHIJ', 80000, '1990-05-21', 'suvendugiri@mydomain.in', 'Suvendu Shekhar Giri' SELECT * FROM @Employees

结果:

SecretCode NetSalary DateOfBirth EmailID FullName
xxxx 0.00 1900-01-01 00:00:00.000 sXXX@XXXX.com Su***ri

它根据掩码函数提供的上下界值参数,用随机值掩码任何数值。

DECLARE @Employees AS TABLE ( SecretCode VARCHAR(10) MASKED WITH (FUNCTION = 'default()'), NetSalary MONEY MASKED WITH (FUNCTION = 'default()'), DateOfBirth DATETIME MASKED WITH (FUNCTION = 'default()'), EmailID VARCHAR(50) MASKED WITH (FUNCTION = 'email()'), FullName VARCHAR(50) MASKED WITH (FUNCTION = 'partial(2,"***",2)'), Age INT MASKED WITH (FUNCTION = 'random(90,100)') ) INSERT INTO @Employees SELECT 'ABCDEFGHIJ', 80000, '1990-05-21', 'suvendugiri@mydomain.in', 'Suvendu Shekhar Giri', 32 SELECT * FROM @Employees

结果:

SecretCode NetSalary DateOfBirth EmailID FullName Age
xxxx 0.00 1900-01-01 00:00:00.000 sXXX@XXXX.com Su***ri 93

SQL Server 2016中的动态数据掩码确实是一个有前景的特性,它有助于避免编写大量自定义脚本来掩码敏感数据。基于角色/访问权限的数据查看方式非常有意义且非常有用。目前,可以基于数据库为用户授予访问权限。如果能够基于表或模式授予这种访问权限,那将是非常好的。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485