19

Internet Explorer 将保存的密码存储在哪里?

而且由于这是一个编程站点,我并不是在问 IE 存储密码的位置,而是 IE 使用哪个 API 来保存密码

起初我假设微软使用的是标准 api:

用于保存域通用程序/网站凭据。

CredRead/CredWrite然后转身使用:

使用当前用户的帐户加密数据。CredRead/CredWrite然后将数据存储在某个神奇的位置,您可以从控制面板中看到其中的内容:

在此处输入图像描述

但我在那里看不到 IE 密码。所以 IE 不使用CredRead/存储密码CredWrite

IE 使用什么 API 来存储密码,如果使用CryptProtectData,那么它将在哪里存储受保护的数据?


编辑:我问的原因不需要解释(因为它很明显),但这是因为我可能想使用相同的机制。

4

3 回答 3

17

我找到了答案。IE 根据密码类型将密码存储在两个不同的位置:

  • Http-Auth: %APPDATA%\Microsoft\Credentials , 在加密文件中
  • 基于表单的: HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage2 , 使用 url 加密

来自NirSoft.com 上的一个非常好的页面

从 Internet Explorer 7.0 版开始,微软彻底改变了密码的保存方式。在以前的版本(4.0 - 6.0)中,所有密码都保存在注册表中称为“受保护的存储”的特殊位置。在 Internet Explorer 7.0 版中,密码保存在不同的位置,具体取决于密码的类型。每种类型的密码在密码恢复方面都有一些限制:

  • 自动完成密码:这些密码保存在注册表中的以下位置: HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage2 密码使用要求输入密码的网站的 URL 加密,因此只有将 URL 存储在历史文件中才能恢复密码。如果您清除历史文件,IE PassView 将无法恢复密码,直到您再次访问要求输入密码的网站。或者,您可以将需要用户名/密码的网站的 URL 列表添加到网站文件中(见下文)。

  • HTTP Authentication Passwords:Documents and Settings\Application Data\Microsoft\Credentials这些密码与局域网计算机的登录密码和其他密码一起存储在Credentials 文件 中。由于安全限制,IE PassView 只有在您拥有管理员权限的情况下才能恢复这些密码。

在我的特殊情况下,它回答了在哪里的问题;我决定我不想复制它。我将继续使用CredRead/ CredWrite,用户可以在其中从 Windows 中已建立的 UI 系统中管理他们的密码。

于 2010-06-11T17:17:53.190 回答
2

简短的回答:在保险库中。从 Windows 7 开始,创建了一个 Vault 用于在其中存储任何敏感数据和 Internet Explorer 的凭据。Vault 实际上是一个 LocalSystem 服务 - vaultsvc.dll。

长答案: Internet Explorer 允许两种凭据存储方法:网站凭据(例如:您的 Facebook 用户和密码)和自动完成数据。从版本 10 开始,引入了一个新术语,而不是使用注册表:Windows Vault。Windows Vault 是凭据管理器信息的默认存储库。

您需要检查正在运行的操作系统。如果是 Windows 8 或更高版本,则调用VaultGetItemW8。如果不是,则调用VaultGetItemW7

要使用“Vault”,您需要加载一个名为“vaultcli.dll”的 DLL 并根据需要访问其功能。

典型的 C++ 代码将是:

hVaultLib = LoadLibrary(L"vaultcli.dll");

if (hVaultLib != NULL) 
{
    pVaultEnumerateItems = (VaultEnumerateItems)GetProcAddress(hVaultLib, "VaultEnumerateItems");
    pVaultEnumerateVaults = (VaultEnumerateVaults)GetProcAddress(hVaultLib, "VaultEnumerateVaults");
    pVaultFree = (VaultFree)GetProcAddress(hVaultLib, "VaultFree");
    pVaultGetItemW7 = (VaultGetItemW7)GetProcAddress(hVaultLib, "VaultGetItem");
    pVaultGetItemW8 = (VaultGetItemW8)GetProcAddress(hVaultLib, "VaultGetItem");
    pVaultOpenVault = (VaultOpenVault)GetProcAddress(hVaultLib, "VaultOpenVault");
    pVaultCloseVault = (VaultCloseVault)GetProcAddress(hVaultLib, "VaultCloseVault");

    bStatus = (pVaultEnumerateVaults != NULL)
        && (pVaultFree != NULL)
        && (pVaultGetItemW7 != NULL)
        && (pVaultGetItemW8 != NULL)
        && (pVaultOpenVault != NULL)
        && (pVaultCloseVault != NULL)
        && (pVaultEnumerateItems != NULL);
}

然后通过调用枚举所有存储的凭据

VaultEnumerateVaults

然后你检查结果。

于 2017-01-29T21:34:18.753 回答
0

不能保证,但我怀疑 IE 使用的是旧的受保护存储API。

于 2010-06-11T14:29:01.030 回答