SQL Server2016是微软发布的一款功能强大的数据库管理系统,它提供了多种功能来增强数据和应用程序的安全性、维护性和检索性。其中,动态数据掩码是SQL Server 2016中新引入的一项重要安全特性,它能够保护敏感数据不被未授权的用户访问。本文将探讨动态数据掩码的工作原理以及如何应用这项技术来保护数据。
在早期,通常在应用程序端通过逻辑处理或在SQL Server端替换字符来掩码敏感数据,然后将掩码后的数据返回给应用程序。如果应用程序未能正确掩码数据,或者敏感数据在网络传输过程中被截获,或者所有具有SELECT权限的SQL Server用户仍可以访问未掩码的数据,那么这些情况下都存在风险。
动态数据掩码通过在查询结果集中动态地掩码指定数据库字段的敏感数据,从而限制了敏感数据的暴露,帮助防止未授权用户访问敏感数据。这项数据保护功能在查询结果集中隐藏了敏感数据,而数据库中的数据并未改变。
数据掩码是将原始数据用随机字符或数据隐藏起来的过程。常见的数据掩码技术包括:
这些技术可以被归类为三种类型:
截至目前,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 Server2016提供了四种掩码函数,用于在查询返回数据时以不同的方式掩码数据。
当希望掩码所有字符时,可以使用默认掩码函数。掩码字符和查询返回的掩码字符数量由以下逻辑确定:
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中的动态数据掩码确实是一个有前景的特性,它有助于避免编写大量自定义脚本来掩码敏感数据。基于角色/访问权限的数据查看方式非常有意义且非常有用。目前,可以基于数据库为用户授予访问权限。如果能够基于表或模式授予这种访问权限,那将是非常好的。