我有一个 C# 应用程序,它使用 ProtectedData
类将密码信息存储在数据库中。我使用本地机器
的范围,据我了解,DPAPI
将使用主 key
对其进行加密,除非我卸载操作系统。
假设我想使用范围DataProtectionScope.CurrentUser
。据我了解,它然后使用受用户密码保护的不同主 key
。因此,当用户更改密码时,保护数据的主 key 保持不变,只是保护数据的密码发生了变化。
我的问题是:用户更改密码后我的数据(在数据库中)是否可以检索(以及如何检索)?
最佳答案
参见this site ,其中包含对系统进行逆向工程的论文(更重要的是,代码)的链接。他们的第一个演示是 this 2010 年 Blackhat Europe 上的一场。
本质上,当前密码的 SHA-1 哈希可以保护 DPAPI 主 key ,而 DPAPI 主 key 又可以保护每个 DPAPI-blob(每个 blob 也有一个盐)。每个主 key 都有一个 GUID,用于标识用于保护它的密码。每个 blob 还具有一个 GUID,用于标识使用哪个主 key 对其进行加密。这些主 key 将在三个月后过期,并创建一个新的主 key ,但旧的主 key 将保留。
如果您更改密码,所有主 key 都会使用新的 SHA-1 哈希值重新加密,但作为保险(例如,该过程可能会中断),旧的 SHA-1 哈希值也会被存储,并使用新的 SHA-1 加密- 1 哈希(以及旧密码和新密码 GUID)(在靠近主 key 的名为 CREDHIST 的文件中),以确保所有 blob 始终可以使用当前密码直接或间接解密。如果您知道当前密码,则可以通过这种方式通过回链找到所有旧密码的密码哈希值。 masterkeys 和 CREDHIST 中的所有这些密码保护也使用用户的 S-ID(因此,如果这种情况发生变化,例如在重新安装 Windows 后,您将无法再解密旧的 blob。)。
关于c# - ProtectedData.用户更改密码后取消保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43909894/