c# - ProtectedData.用户更改密码后取消保护

标签 c# encryption passwords dpapi system.security

我有一个 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/

相关文章:

java - 从 Spring Boot 应用程序检查密码是否在 Keycloak 中有效

c# - 使用 System.Web.Routing 时遇到的问题

c# - 正确的数据类型用于类型映射?

java - Camel PGP 加密和对称 key

encryption - JWT - 什么算法 "harder to hack"

正则表达式验证具有字符限制的密码

c# - 避免默认构造函数和公共(public)属性 setter

c# - 这可以创建 GTM.js 服务器端逻辑吗?

使用 SSL 密码连接 nginx websocket

android - 在 EditText 中显示密码的最后一个字符