用户更改密码后的ProtectedData.Unprotect

时间:2017-05-11 08:10:35

标签: c# encryption passwords dpapi system.security

我有一个C#应用程序,它使用local machine类将密码信息存储在数据库中。我使用DPAPI的范围,据我所知,master key将使用DataProtectionScope.CurrentUser加密它,除非我卸载操作系统,否则不会更改。

我想说我想使用范围master key。据我了解,然后使用受用户密码保护的不同 select CAST (SCOPE_IDENTITY() As int) 。因此,当用户更改密码时,保护数据的主密钥保持不变,只保护密码的密码发生了变化。

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

1 个答案:

答案 0 :(得分:1)

请参阅this site,其中包含对论文(更重要的是代码)的反向工程系统的链接。他们的第一次演讲是2010年Blackhat Europe的this演出。

基本上,当前密码的SHA-1哈希保护DPAPI主密钥,后者依次保护每个DPAPI-blob(每个blob盐也有)。每个masterkey都有一个GUID,用于标识用于保护密码的密码。每个blob还有一个GUID,用于标识用于加密的masterkey。这些masterkey在三个月后过期,并且创建了一个新的,但是旧的masterkey被保留。

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