我知道可以使用以下方式以编程方式验证用户的Windows(例如域名)凭据:
LogonUser(username, password)
有一段时间我想要坚持这些证书。
我正在使用Data Protection API(通过CredUI API)加密密码。这意味着加密数据只能由用户自己访问。我的程序以用户身份运行,然后可以解密受保护的数据。
但这也意味着以用户身份运行的恶意程序可以解密受保护的数据;窃取用户的加密凭证。
我知道Windows本身并不存储用户的password
。他们存储的是密码的盐渍和散列版本;并在用户和Windows之间形成“共享密钥”。
当我知道密码的 salted hash 时,是否有一个API可以让我询问Windows用户的密码是否有效?
答案 0 :(得分:0)
如果您有域控制器,则可以与kerberos协议通信并发送密码派生的密钥以验证用户身份。不幸的是,虽然恶意程序无法从密钥中获取原始密码,但仍然可以使用它来代表用户获取域凭据。
在这里查看如何从密码中获取密钥
http://www.opensource.apple.com/source/Heimdal/Heimdal-172.18/kuser/kinit.c
顺便说一下,Kerberos不使用密码的普通盐渍哈希。实际的密钥生成函数涉及更多,这是因为密码短语本身没有足够的熵来创建不可思议的密钥。请记住,kerberos应该能够抵御窃听攻击。
答案 1 :(得分:0)
您确实不希望存储Windows密码哈希,因为已经指出,如果存在域控制器,则可以使用哈希来模拟用户。实际上,了解Kerberos中的实际密钥与了解攻击者的密码一样糟糕。相反,你应该做的是使用与Windows不同的盐来密码密码并存储它。我建议寻找像PBKDF2这样的良好密码哈希的实现并使用它。请参阅Wikipedia's实施列表。有关Kerberos用于密码密码的信息,请参阅RFC 3962。 Windows将该进程用于AES,并对NTLM和RC4 Kerberos使用不同的进程。
我有理由相信没有公开API来比较Kerberos盐渍密码。我对NTLM API不太熟悉。