【问题标题】:ProtectedData.Unprotect after User changes passwordProtectedData.Unprotect 用户更改密码后
【发布时间】:2017-10-10 03:07:47
【问题描述】:
我有一个 C# 应用程序,它使用 ProtectedData 类将密码信息存储在数据库中。我使用local machine 的范围,据我了解,DPAPI 将使用master key 对其进行加密,除非我卸载操作系统,否则它不会被更改。
假设我想使用作用域DataProtectionScope.CurrentUser。据我了解,它使用受用户密码保护的 不同 master key。因此,当用户更改密码时,用于保护数据的主密钥保持不变,而只是更改了保护数据的密码。
我的问题是:在用户更改密码后,我的数据(在数据库中)是否可检索(以及如何检索)?
【问题讨论】:
-
您可能有的另一个问题是,在用户更改密码后,DPAPI 如何访问 MasterKey?答案又是一个两步过程。首先,DPAPI 钩入密码修改模块,当用户修改密码时,所有 MasterKeys 都会在新密码下重新加密。 Ref
标签:
c#
encryption
passwords
dpapi
system.security
【解决方案1】:
请参阅this site,其中包含论文链接(更重要的是,代码)对系统进行逆向工程。他们的第一次演讲是 this 在 Blackhat Europe 2010 上发表的。
本质上,您当前密码的 SHA-1 哈希值保护 DPAPI 主密钥,进而保护每个 DPAPI-blob(每个 blob 也有一个盐)。每个主密钥都有一个 GUID,用于标识用于保护它的密码。每个 blob 还有一个 GUID,用于标识用于加密它的主密钥。这些主密钥在三个月后到期,并创建一个新的,但保留旧的。
如果您更改密码,所有主密钥都将使用新的 SHA-1 哈希重新加密,但作为保险(该过程可能会中断,例如)旧的 SHA-1 哈希也会被存储,并使用新的 SHA- 1 个哈希(以及旧密码和新密码 GUID)(在靠近主密钥的名为 CREDHIST 的文件中),以确保所有 blob 始终可以直接或间接地使用当前密码解密。如果您知道当前密码,则可以通过链接找到所有旧密码的密码哈希。 masterkeys 和 CREDHIST 中的所有这些密码保护也使用用户的 S-ID(因此,如果这会发生变化,例如在重新安装 Windows 之后,您将无法再解密旧的 blob。)。
【解决方案2】:
请注意,如果您手动更改本地用户的密码,您将收到以下警告,并且该用户使用ProtectedData 和DataProtectionScope.CurrentUser 加密的任何数据,将丢失/无法访问,就像警告说的那样: