我不确定在SQL Server DB的单个列中隐藏数据的两种方法。
1. SQL Always Encrypted
2. SQL Dynamic Data Masking
在阅读完这两篇文章后,我的理解是,Always Encrypted
比Dynamic Data Masking
更安全,因为存储的数据是加密的,而不是在密码上加上掩码。
但是,如果用户只是想向数据库管理员隐藏密码字段,那么在这种情况下的日常使用会有什么影响?
要隐藏的数据:密码
使用“密码”列的功能:重置密码,更改密码,在创建新用户时插入新密码行
任何建议将不胜感激。
P.S。我最初的计划是对密码字段使用SHA1 + Salt哈希,并存储哈希值而不是密码。但是,如果只需要在DB中隐藏该字段,我发现上面的其他两种方法可能就足够了。
答案 0 :(得分:1)
如果要向数据库管理员隐藏PW,则动态数据屏蔽不在工作范围内。这只是在表示层将其掩盖。
AlwaysEncrypted将加密的责任移交给客户端应用程序,这意味着加密和解密是在应用程序之外进行的,通常来说数据库管理员无法读取数据。
因此,这取决于您对隐藏的定义。如果您希望它对管理员隐藏,则始终需要加密。
编辑
Always Encrypted始终仅在2016年提供给入门者,但自2005年以来一直提供列级加密。但是要回答您的问题,不,DBA不必拥有王国的密钥。 AE被设计为在驱动程序级别处理加密和解密。以下信息来自official 70-764 exam reference by Victor Isakov:
在较高的层次上,AE体系结构的工作如图1-5所示:
答案 1 :(得分:1)
在任何情况下,都不得将密码存储在数据库表中或与此有关的任何时间段内。
您应该对密码进行哈希处理并存储哈希值。考虑使用SHA 2或更高版本,并加盐。
有关更多详细信息,请参见NIST:https://csrc.nist.gov/Projects/Hash-Functions
SQL Server 2008+最多支持SHA2-512:
https://docs.microsoft.com/en-us/sql/t-sql/functions/hashbytes-transact-sql?view=sql-server-2017
DECLARE @HashThis NVARCHAR(4000)
SET @HashThis = CONVERT(NVARCHAR(4000),'dslfdkjLK85kldhnv$n000#knf');
SELECT HASHBYTES('SHA2_512', @HashThis);
要查看如何添加密码,请参阅下面的文章。值得指出的是,散列和加盐应在应用程序层进行处理,因为DBA可以看到在SQL Profiler中加盐的密码。要非常小心。
https://www.mssqltips.com/sqlservertip/3293/add-a-salt-with-the-sql-server-hashbytes-function/
其他信息:
最后一点:如果有可能,您正在执行此练习作为对Web应用程序中的用户进行身份验证的方法,那么您应该为指定的应用程序框架查找身份验证模块。例如,ASP.NET随Microsoft的Identity 2.0系统一起提供,该系统处理端到端的身份验证过程。