3

我知道可以使用以下方式以编程方式验证用户的 Windows(例如域)凭据:

有一段时间我想坚持这些凭据。

我正在使用数据保护 API(通过CredUI API)来加密密码。这意味着加密数据只能由用户自己访问。我的程序以用户身份运行,然后可以解密受保护的数据。

但这也意味着以用户身份运行的恶意程序可以解密受保护的数据;窃取用户的加密凭据。

我知道 Windows 本身不存储用户的password. 他们存储的是密码的加盐和散列版本;并形成用户和 Windows 之间的“共享机密” 。

当我知道密码的加盐哈希时,是否有一个 API 可以让我询问 Windows 用户的密码是否有效?

4

2 回答 2

0

您真的不想存储 Windows 密码散列,因为如前所述,如果存在域控制器,散列可用于模拟用户。实际上,知道 Kerberos 中的实际密钥与知道攻击者的密码一样糟糕。相反,你应该做的是用不同于 Windows 使用和存储的盐对密码进行加盐。我建议寻找像 PBKDF2 这样的良好密码哈希的实现并使用它。请参阅Wikipedia 的实现列表。有关 Kerberos 对密码进行加盐处理的信息,请参阅RFC 3962。Windows 将该进程用于 AES,并为 NTLM 和 RC4 Kerberos 使用不同的进程。

我有理由确定没有公开 API 来比较 Kerberos 加盐密码。我对 NTLM API 不太熟悉。

于 2013-11-22T01:07:15.313 回答
0

如果您有域控制器,您可以使用 kerberos 协议并发送从密码派生的密钥以验证用户身份。不幸的是,尽管恶意程序无法从密钥中获取原始密码,但它仍然可以使用您的哈希值并使用它代表用户获取域凭据。

看这里找出如何从密码中派生密钥

http://www.opensource.apple.com/source/Heimdal/Heimdal-172.18/kuser/kinit.c

顺便说一句,Kerberos 不使用密码的普通加盐哈希。实际的密钥生成函数涉及更多,这是因为密码本身没有足够的熵来创建不可猜测的密钥。请记住,kerberos 应该能够抵御窃听攻击。

于 2012-08-03T00:00:05.740 回答