在Windows中获取登录用户的用户名/密码

时间:2020-03-06 14:31:39  来源:igfitidea点击:

Windows中是否有任何API可以获取当前登录的用户名和密码?

先感谢我们。

解决方案

如果可以的话,我认为这是一个巨大的安全漏洞!

GetUserName将为我们获取名称,但我们无法获取密码。 Windows甚至都没有存储它,AFAIK仅是我们密码的哈希值。

根据我们要实现的目标(我们可以告诉我们更多..),可以模拟已登录的用户并代表他/她执行操作。

由于用户的密码已加密,因此我们无法获取它的密码(更不用说不以明文形式存储密码的标准做法)。

要获取用户名,可以使用GetUserName或者NPGetUser

我们可以使用GetUserName()获取用户名,但无法获取密码;这将违反虚拟实体101的安全性。

密码:不,出于安全原因,不会保留该密码,然后将其丢弃。我们可以从注册表中获取给该用户的加密密码,并提供足够的特权,然后使用例如Rainbow表的方式对其进行解密,但是使用当前方法非常耗资源并且耗时。更好地提示用户。

另外,如果我们要像Novell一样实现某种"单一登录"系统,则应通过GINA(Vista之前的版本)或者凭据提供程序(Vista)来实现,这将导致为代码提供用户名登录时输入密码和密码,这是唯一可以使用的密码。

对于用户名,获取当前用户名(运行代码的人)很容易:AdvApi32.dll中的GetUserName函数正是为我们执行此操作的。

如果我们是作为服务运行的,则需要记住没有一个"登录用户":除了任何实际人员外,任何时候都有多个用户,例如LocalSystem,NetworkService,SYSTEM和其他帐户。本文提供了一些示例代码和文档。

请注意,确定如何完成此操作,但是http://www.nirsoft.net/utils/network_password_recovery.html中的"网络密码恢复"工具似乎是从某些缓存中获取密码的。

Windows API中身份验证的完整详细信息可以在MSDN上找到:
http://msdn.microsoft.com/zh-CN/library/aa374735(VS.85).aspx

重新"网络密码恢复"工具
Windows(最高XP)使用简单易破解的加密存储passwd的副本,以连接到较旧的lanmanager网络共享。
该工具通常会尝试使用所有可能的密码来解决此问题,使用rainbow表(字典词的预先计算的加密版本)可以加快此过程。

在XPsp2 / 3 Vista中,此功能已删除。新的加密方法很难破解,需要花费许多小时才能尝试所有可能的值,在线服务可以在大量计算机上运行该加密算法,从而为我们提供价格的快速解答。

要回答原始张贴者,通常不存储密码并将其与用户键入的密码进行比较。我们对输入的密码进行加密(实际上是散列)并存储。要检查密码,我们可以对用户输入的内容进行相同的加密,然后进行比较。通常不可能从加密形式返回到真实密码。

编辑我怀疑我们在这里问错了一个问题,为什么要输入密码,我们要验证什么?何时输入?