ProtectedData.Unprotect 用户更改密码后

ProtectedData.Unprotect after User changes password

我有一个 C# 应用程序使用 ProtectedData class 在数据库中存储密码信息。我使用 local machine 的范围,据我了解 DPAPI 将使用 master key 对其进行加密,除非我卸载 OS.[=17= 否则不会更改它]

假设我想使用范围 DataProtectionScope.CurrentUser。据我了解,它然后使用受用户密码保护的 different master key 。因此,当用户更改密码时,用于保护数据的主密钥保持不变,只是保护它的密码发生了变化。

我的问题是:用户更改密码后我的数据(在数据库中)是否可以检索(以及如何检索)?

参见 this site, which has links to papers (and more importantly, code) reverse engineering the system. Their first presentation was this Blackhat Europe 2010。

本质上,您当前密码的 SHA-1 哈希保护 DPAPI 主密钥,后者又保护每个 DPAPI-blob(也有一个 per blob salt)。每个主密钥都有一个 GUID,用于标识用于保护它的密码。每个 blob 还有一个 GUID,用于标识哪个主密钥用于对其进行加密。这些万能密钥在三个月后过期并创建了一个新的,但旧的仍然存在。

如果您更改密码,所有主密钥都将使用新的 SHA-1 哈希值重新加密,但作为保险起见(过程可能会中断,例如)旧的 SHA-1 哈希值也会被存储,并使用新的 SHA-1 哈希值进行加密SHA-1 哈希(以及旧密码和新密码 GUID)(在靠近主密钥的名为 CREDHIST 的文件中),以确保所有 blob 始终可以使用当前密码直接或间接解密。如果您知道当前密码,则可以通过回链找到所有旧密码的密码哈希。 masterkeys 和 CREDHIST 中的所有这些密码保护也使用用户的 S-ID(因此如果这会发生变化,例如在重新安装 Windows 之后,您将无法再解密旧的 blob。)。

请注意,如果您手动更改本地用户的密码,您将收到以下警告,并且使用该用户的 DataProtectionScope.CurrentUser ProtectedData 加密的任何数据,将是 lost/unaccessable,就像警告说的那样: