如何从 Windows Vault 凭据管理器存储和检索凭据?

2023-12-15

我想在 Windows PC 上安全地存储明文密码。我目前正在使用 DPAPICryptProtectData对其进行加密,然后将加密的 blob 存储在用户本地 AppData 的文件中。

在 Windows 7 中,有 Windows Vault,这是一个凭据管理器(控制面板\用户帐户和家庭安全\凭据管理器),用于存储各种登录类型的登录数据,包括“通用凭据”。从表面上看,这似乎是程序存储凭据的正确位置。但是,我找不到任何 API。我读认证功能参考MSDN,但坦率地说迷失其中。

是否有用于 Windows Vault 的 API 来存储和检索程序中的凭据?如果有,我在哪里可以找到文档?


非常感谢 @Luke 的提示:用于存储凭据并从 Windows Vault 读取凭据的 Windows API 函数是CredWrite() and CredRead()。这是一个可以编译和运行的代码示例,我用它来确认这些函数确实做了预期的事情:

#include <windows.h>
#include <wincred.h>
#include <wchar.h>
#pragma hdrstop

#pragma comment(lib, "advapi32.lib")  // Or pass it to the cl command line.

int main ()
{
    { //--- SAVE
        char* password = "brillant";
        DWORD cbCreds = 1 + strlen(password);

        CREDENTIALW cred = {0};
        cred.Type = CRED_TYPE_GENERIC;
        cred.TargetName = L"FOO/account";
        cred.CredentialBlobSize = cbCreds;
        cred.CredentialBlob = (LPBYTE) password;
        cred.Persist = CRED_PERSIST_LOCAL_MACHINE;
        cred.UserName = L"paula";

        BOOL ok = ::CredWriteW (&cred, 0);
        wprintf (L"CredWrite() - errno %d\n", ok ? 0 : ::GetLastError());
        if (!ok) exit(1);
    }
    { //--- RETRIEVE
        PCREDENTIALW pcred;
        BOOL ok = ::CredReadW (L"FOO/account", CRED_TYPE_GENERIC, 0, &pcred);
        wprintf (L"CredRead() - errno %d\n", ok ? 0 : ::GetLastError());
        if (!ok) exit(1);
        wprintf (L"Read username = '%s', password='%S' (%d bytes)\n", 
                 pcred->UserName, (char*)pcred->CredentialBlob, pcred->CredentialBlobSize);
        // Memory allocated by CredRead() must be freed!
        ::CredFree (pcred);
    }
}

通用凭据存储在 Windows Vault 中,如屏幕截图所示:

A generic credential stored in Windows Vault

附录:Vault 与 Crypto DP API

这个答案似乎很受欢迎,自从我写它以来近 6 年里,它经常被点赞。评论中提出了关于在保险库中存储凭证和使用以下方法加密凭证 blob 之间的区别的问题:::CryptProtectData()API 并随时存储它。这是我对主要差异的理解,可能并非详尽无遗。

  • 漫游控制。 Vault 中的存储由系统管理。在域环境下,设置cred.Persist = CRED_PERSIST_ENTERPRISE;使加密凭据成为用户漫游配置文件的一部分,从而可供登录到任何域计算机的用户使用。CryptProtectData()仅加密数据;密文的保存是用户的责任。将密文存储在%APPDATA%也可能使其漫游,具体取决于域的漫游设置,但是在文件上设置正确的 ACL and 使用 EFS 强制执行静态加密再次强调,这是调用者的责任。 Vault 数据由系统静态加密。
  • 用户界面可见性。 Vault 凭证显示在 Vault UI 中,当不再需要或怀疑被泄露时,可能会被撤销。密文获取自CryptProtectData()完全由应用程序控制。在目标软件设计中必须考虑可见性功能。
  • Vault 支持易失性的每个登录会话机密,加密存储在内存中(cred.Persist = CRED_PERSIST_SESSION;)。使用通用 API 实现此类功能相对较难,因为它涉及经过身份验证的 IPC 或具有同步功能的正确保护的共享内存映射等。
  • 盐。的情况下CryptProtectData(),调用者可以提供额外的盐(在解密过程中必须再次提供,因此有办法存储它)。 Vault 在内部处理它。
  • Vault 的范围较窄。使用 Vault 存储与身份无关的数据可能是一种设计味道。
  • Audit. CryptProtectData()可以控制在解密 Blob 时创建审核记录(CRYPTPROTECT_AUDIT位标志)。我在 Vault API 中看不到类似的内容(wincred.h)。我不知道是否可以审核 Vault 访问;是否总是完成、从未完成或由 GPO 控制;事实上,我在这里画了一个空白。
  • 保险库受保护HVCI(née设备卫士;仅适用于 Windows 10/11 专业版和企业版以及相应的服务器 SKU)。启用后,系统的受保护部分在单独的半虚拟化、硬件支持、严格控制的地址空间中运行,该地址空间在常规地址空间中根本“不存在”(HVCI 保护的空间是 LSA 和其他关键组件的所在位置)也住)。这使得即使从内核模式堆栈也无法访问它。虽然 CNG 供应商也住在那个隔间里,但结果是CryptProtectData()当密文 blob 交回调用程序时,必然会跨越此边界(另外,我不确定是否CryptProtectData()是否有 CNG 支持)。保险库加密的数据保留在受保护的边界内;只有明文穿过它。

总之,Vault 是一个更高级别的、目标狭窄的 API,用于保存用户可见、用户管理的凭据和其他与身份相关的机密,并通过系统 UI 进行管理。CryptProtectData()是通用加密 API,具有更大的灵活性,需要编写和审核更多代码才能安全地管理持久密文。

两者中哪一个“更安全”的问题是不恰当的。没有“或多或少安全”的定义可以适用于所有加密的使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Windows Vault 凭据管理器存储和检索凭据? 的相关文章

  • 允许 iframe 跨域链接到目标父框架

    我有 2 个域 域 1 上的一个页面使用 iframe 加载域 2 中的内容 如何允许来自domain2 iframe 内 的链接在domain1 的完整父框架中打开 我一直在关注IE和w3c的新沙箱属性 http www w3 org T
  • 安全网络登录示例/教程[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 为 Web 应用程序创建登录表单的方法有很多种 但大多数方法都存在这样或那样的缺陷 密码以明文形式传输
  • 从 Symfony2 中的 http_basic auth 注销

    每当我去 admin logout 我已正确重定向到项目的根目录 但在访问时仍处于登录状态 admin 因为没有提示我输入凭据 这是我的配置 安全 yml security firewalls admin area pattern admi
  • .Net Core IdentityServer4 获取经过身份验证的用户

    我试图弄清楚如何使用 Net Core 2 从身份服务器 4 检索登录用户 我的身份验证当前正在工作 我只是想弄清楚如何从 HTTP 上下文中检索声明身份 services AddAuthentication options gt opti
  • 如何在超时后关闭上下文菜单?

    我需要有一个上下文菜单 当前使用 TrackPopupMenu 创建 在一段时间不活动后自动关闭 我正在尝试搜索 但只找到相反的结果 如何activate超时后的弹出窗口 或针对特定应用程序的专门内容 我发现的唯一接近的事情是枚举桌面的子级
  • 原子 x86 指令与 MS 的 InterlockedCompareExchange 文档的对齐要求?

    微软提供了InterlockedCompareExchange http msdn microsoft com en us library ms683560 28VS 85 29 aspx用于执行原子比较和交换操作的函数 还有一个 Inte
  • 使用 eval 时不会受到 XSS 威胁

    我正在制作 不是现在 但我仍然对这个感到好奇 一款使用 HTML5 和 JS 的游戏 我想要的是人们可以插入自定义脚本 但要安全 function executeCustomJS code eval code bad 当然这段代码非常糟糕
  • 如何使用苹果钥匙串?

    我正在尝试使用scifihifi iphone 来自 Github http github com ldandersen scifihifi iphone tree master security存储和检索用户名和密码 但是 当我添加课程时
  • 每次页面重新启动时,Firebase.auth().currentUser 都会变为 null

    我正在使用 firebase 身份验证与 vue 应用程序 每次登录用户后重新启动页面时 currentUser 都会变为 null firebase auth signInWithEmailAndPassword this email t
  • 访问 Amazon EC2 上的 Mongodb 时出现问题

    我还有一个问题要问你 我有安装了 mondodb 的 Amazon EC2 实例 它工作得很好 除了一件事 我无法从外部 我的电脑 访问 连接到 它 我认为安全组的问题 这是某种默认防火墙 有谁知道如何配置EC2实例来访问mongodb 提
  • 如何使用 P/Invoke 在 PowerShell 1.0 中调用 Win32 函数?

    在许多情况下 从 PowerShell 脚本调用 Win32 函数或其他一些 DLL 会很有用 给定以下函数签名 bool MyFunction char buffer int bufferSize 我听说 PowerShell CTP 2
  • 将 WordPress 的登录/注册页面重定向到自定义登录/注册页面

    我有一个网站 有一个用户系统 我想将 WordPress 的用户系统集成到该网站的用户系统中 但我仍然想使用该网站的注册 登录页面 我不希望任何人能够使用 Wordpress 的登录或注册表单登录或注册 相反 当他们尝试访问 Wordpre
  • win32 Python - pythoncom 错误 - ImportError: 没有名为 pywintypes 的模块

    我正在尝试导入 pythoncom 但它给了我这个错误 Traceback 最近一次调用最后 文件 F Documents and Settings Emery Desktop Python 27 Try 第 2 行 位于 导入python
  • Symfony2 安全性 @Secure 注释不起作用

    我正在尝试使用注释来保护我的控制器 namespace Vinny StreamBundle Controller use Symfony Bundle FrameworkBundle Controller Controller use J
  • 当机器人攻击时! [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C++:获取注册表值仅给出第一个字符[重复]

    这个问题在这里已经有答案了 我试图从注册表中获取字符串值 但我只得到第一个字母 HKEY hKey char gamePath MAX PATH if RegOpenKeyEx HKEY CURRENT USER L Software Bl
  • 如何使用 Visual C++ 在 win32 API 中创建圆形/圆形按钮

    我有一个 Visual C 中的 Window Win32 API 应用程序 我没有使用MFC 我必须创建一个带有位图图像的圆形 圆形按钮 我的应用程序有一个皮肤视图 任何人都可以帮助我完成这项任务吗 按钮是窗口 您可以使用 CreateW
  • GetDeviceCaps获取的物理屏幕尺寸不是我屏幕的实际物理尺寸

    在 Windows 7 下 我使用以下代码来获取屏幕的物理宽度 以毫米为单位 hSize 为 482 比实际尺寸约 310 用尺子测量 大得多 这是为什么 HDC screen GetDC NULL int hSize GetDeviceC
  • SQLite 数据库安全

    我正在构建一个使用 Sqlite DB 的应用程序 用户可以将他们的信息输入数据库并检索它们 但是 我希望他们能够备份 sqlite 数据库 我所做的是将 sqlite 数据库放入文档文件夹中 以便他们可以使用 iTunes 将其检索出来
  • 合并 2 个 .jks 信任库文件

    我正在使用启用了 SSL 的 Tomcat 并使用信任库进行客户端身份验证 我有两个 jks trustore 文件 第一个 我将其用于 PROD 环境 另一个用于 TEST 环境客户端证书 我在 Tomcat 上部署了 Web 应用程序

随机推荐

  • 如何在 Linux 上为 Aptana 设置内部浏览器

    我下载了 Aptana Studio Setup Linux zip 包 解压并运行 AptanaStudio 一开始很好 但报告了一个问题 无法创建此编辑器的嵌入式浏览器小部件 它不适用于您的操作系统 或者需要配置系统才能支持嵌入式浏览器
  • 是否可以从不同的布局初始化视图?

    我有一个Activity并与之相关layout 另外我还有另一个layout和一些Views 我想初始化一个变量 TextView 从我的Activity用一个View从那个独立的layout 我总是得到null public void o
  • 如何在 C# 应用程序中使用 Shell32?

    为了使 Shell32 正常工作 我应该在 C 应用程序中包含什么 Edit 我的应用程序无法识别 shell32 我应该包含哪些参考文献或库 我想做的是 Shell32 Shell shell new Shell32 Shell 我收到的
  • 全日历 slotMinutes 不起作用

    我想在我的日历中显示 15 分钟的 slotMinutes 但这不起作用 在这个小提琴上效果很好 document ready function var calendar calendar fullCalendar defaultView
  • Android - 无法获取某些联系人的电话号码

    我在提取联系人列表中某些人的电话号码时遇到问题 首先 我在列表视图中显示所有联系人 String projection new String ContactsContract Contacts ID ContactsContract Com
  • 如何在弹出通知时播放声音?

    我正在开发一个应用程序 用户可以使用两个开关按钮打开 关闭通知和通知声音 我创建了在状态栏上弹出的通知 我想在它们出现时播放默认声音 我编写了以下代码 但它似乎不起作用 关于如何让通知声音播放有什么想法吗 import android an
  • 连接两个 JInternalFrame 实例的 CubicCurve2D

    我一直在尝试找到一种方法 在 Swing 中 连接两个JInternalFrame与一个CubicCurve2D 也称为三次贝塞尔曲线 我想要实现的总体效果是一个类似于雅虎 管道 曲线应从一个内部框架的底部延伸到另一个内部框架的顶部 这里有
  • 如何在任何打开的窗口中获取鼠标下的文本

    我正在做一个C 语言的项目 我想制作一个类似于 Narcis 或 Easylingo 的词典 用户可以使用鼠标 只需在任何应用程序中将光标移动到单词上 然后程序就会检测到该单词并找到该特定单词的含义 我的问题是如何在 Microsoft O
  • 为什么 SetWindowsHookEx 必须与 Windows 消息队列一起使用

    我一直在尝试使用钩子进行一些操作 但我不明白为什么钩子必须与消息队列一起使用 hook SetWindowsHookEx WH KEYBOARD LL KeyboardProc NULL 0 MSG msg while GetMessage
  • 为什么c++标准库不起作用?

    我一直在尝试让我从学校服务器下载的程序在我的 Mac 上离线运行 我尝试按照教程更新 GCC 但由于某种原因 即使我使用了给定的命令 教程也不起作用 现在 当我编译时 我收到一条错误 指出未找到 我不明白 我已经更新了 Xcode 遵循了大
  • Android:画布层上的 UI 元素

    如何在画布上 顶部 设置一些 UI 元素 我有一个简单的触摸游戏 其图形放置在带有画布的自定义视图上 然而 由于我的全屏面板位于 setContentView 中 我无法添加任何 UI 项目 例如进度条或徽标 我希望整个画布层可见 一些对象
  • 让 Hibernate 忽略未映射的实例变量[重复]

    这个问题在这里已经有答案了 我认为 hibernate 仅考虑带有注释的实例变量 Column 但奇怪的是 今天当我添加一个变量 未映射到任何列 只是类中需要的变量 时 它试图将该变量作为列名包含在 select 语句中并引发错误 字段列表
  • 我如何告诉 jaxb / Maven 生成多个模式包?

    Example
  • 在没有目的地的情况下获取 Google 地图上 x 公里后的纬度经度?

    我正在创建一个Android应用程序需要在 X 公里后找到同一条路线上的坐标 我有两个坐标x1 y1 x2 y2在一条路上 现在 我的要求是找到坐标x3 y3大约 3 公里后 即坐标x2 y2不在之间x1 y1 x2 y2 在同一条路上 如
  • 从 one2many 字段创建记录时设置默认值 - odoo

    我想在从 one2many 字段创建记录时为多个字段设置默认值 因为该默认值将从父模型中获取 Odoo 模型结构 class purchase order models Model inherit purchase order cash f
  • Cloudera 5.4.2:使用 Flume 和 Twitter 流时 Avro 块大小无效或太大

    当我尝试 Cloudera 5 4 2 时出现了一个小问题 基于这篇文章 Apache Flume 获取 Twitter 数据http www tutorialspoint com apache flume fetching twitter
  • jQuery 未与 HTML 文件链接

    我正在学习编程 并遇到了一些本来应该非常简单的事情 但却让我沮丧了三天 我似乎无法让 jQuery 文件与我的 html 链接 这是我的 HTML div class heads div div div
  • 将CPU寄存器保存到GCC中的变量中

    我想获取 EAX EBX ESP EIP 等中的值并将它们保存在 C 变量中 例如 int cEax asm mov cEax eax 你可以用这个 register int eax asm eax register int eax asm
  • “滚动”到长文本输入的最右侧

    我有一个图像选择器 允许从图库中选择图像 然后将 URL 填充到
  • 如何从 Windows Vault 凭据管理器存储和检索凭据?

    我想在 Windows PC 上安全地存储明文密码 我目前正在使用 DPAPICryptProtectData对其进行加密 然后将加密的 blob 存储在用户本地 AppData 的文件中 在 Windows 7 中 有 Windows V