使用哈希算法验证用户的密码?

3
我知道可以使用以下方法来编程验证用户的Windows (例如域)凭据: 现在我想保存这些凭据。我正在使用数据保护API(通过CredUI API),对密码进行加密。这意味着只有用户本身才能访问加密数据。我的程序作为用户运行,然后可以解密受保护的数据。
但这也意味着一个恶意程序作为用户运行时可以解密受保护的数据,窃取用户的加密凭据。
我知道Windows本身不存储用户的password。他们存储的是密码的加盐和哈希版本,并形成用户与Windows之间的“共享秘密”
是否有API可以让我在知道密码的加盐哈希值时询问Windows用户的密码是否有效?

这与您的问题并不相关,但我不相信Windows会对密码哈希进行盐处理。 - Carey Gregory
2个回答

0

你真的不想存储Windows密码哈希值,因为正如已经指出的那样,如果域控制器存在,该哈希值可以用于冒充用户。实际上,知道Kerberos中的实际密钥就像知道攻击者的密码一样糟糕。相反,你应该使用与Windows不同的盐来加密密码并将其存储。我建议寻找一个好的密码哈希实现,比如PBKDF2,并使用它。请参阅维基百科的实现列表。有关Kerberos对密码加盐的详细信息,请参见RFC 3962。Windows使用该过程进行AES加密,并使用不同的过程进行NTLM和RC4 Kerberos。

我相当确定没有公共API可用于比较Kerberos加盐密码。我对NTLM API的了解较少。


我真的不想存储Windows密码哈希(加密)。但现在我正在存储Windows密码本身(加密)。我更喜欢存储一些抽象的“令牌”,而不是密码。一个人密码的保密性比能够冒充他们更重要(我不在乎你是否可以在工作中模拟我的域凭据 - 但如果你知道我的个人私人密码,我会疯掉)。 - Ian Boyd
当然,我已经向您指出了符合您所述约束条件的解决方案。 - Sam Hartman

0
如果您拥有域控制器,就可以使用Kerberos协议进行通信,并发送从密码派生的密钥以验证用户身份。不幸的是,尽管恶意程序无法从密钥中派生出原始密码,但它仍然可以窃取您的哈希并利用其代表用户获取域凭据。
请查看此处以了解如何从密码中派生出密钥。

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

顺便提一下,Kerberos不使用明文盐哈希密码。实际的密钥生成函数要更加复杂,这是因为口令本身没有足够的熵来创建无法猜测的密钥。请记住,Kerberos应该对窃听攻击具有弹性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接