问题标签 [dpapi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
502 浏览

c# - 加密登录密码以在多个设备上使用

可能是我想太多,把复杂的事情想的太多,把自己绑在了一个结上。我对加密也不太了解,所以这无济于事。

我有一个应用程序,其中包含使用 AES 类加密的字段(我在另一个问题中发现此处发布),然后将加密的字符串保存在 XML 文件中。现在,用于加密每个字符串的密码由用户提供,并在他们第一次使用该程序时进行设置。这部分工作正常,我可以根据需要完美地加密和解密数据。

我遇到的问题是用于加密这些字符串的密码存储在应用程序内的配置文件中。最初我想我会使用 DPAPI 来加密这个密码,然后保存在配置文件中,一切似乎都按照我的意愿工作。用户启动程序,设置密码,添加一些字符串,一切都很好地加密和解密,一切都很好。

问题是这在创建密码的计算机上运行良好,但是一旦我尝试在另一台计算机上使用它,DPAPI 就会引发错误(我假设是因为 DPAPI 是特定于机器的?)

所以基本上我需要一种方法来加密用户在首次启动时设置并存储在配置文件中的密码,但我不能使用我用来加密其他数据的 AES 类,因为它需要密码来加密它! !!

正如我所说,我的 AES 类可以完美地加密其他数据,但我需要一种方法来保护存储在 app.config 文件中的密码,而不是使用 DPAPI 对其进行加密,这样我就可以在其他设备上使用它而不会出错。

我希望这是有道理的,我的头疼!!!!

非常感谢任何帮助

附加信息:

该应用程序是一个非常简单的 winform 应用程序,当输入正确的密码并将程序存储在 USB 记忆棒上时,它允许访问数据,使其可以连接到任何计算机并解密和查看数据。没有用户结构,您只需要正确的密码即可访问应用程序并查看数据。用于访问应用程序的密码是用于加密数据的密码。

重复的问题:问题是不同的,因为在他们的情况下,DPAPI 做了他们在我的情况下需要的,它不像我在原始问题中已经表达的那样!

0 投票
0 回答
904 浏览

encryption - 使用 DPAPI 解密加密值

我已经加密了值,并尝试使用asp_regiis.exe.

当我运行这个命令时:

我有这个错误:

正在解密配置部分...

无法使用提供程序“DataProtectionConfigurationProvider”解密。来自提供商的错误消息:

这似乎有什么问题?我需要找到解密的值。请指教。

0 投票
2 回答
1665 浏览

c# - .NET DPAPI 和 AES 加密:感知检查

我正要为我目前正在开发的网站编写一个新的加密系统,如果可能的话,我想看看是否可以让某人在开始之前对其进行感知检查!

更新: 我原来的问题应该更清楚。我需要加密一些用户数据,我还需要能够在以后读取数据。而且,我还需要存储用户密码或密码哈希,以便在登录时验证用户。

计划是:

  1. 主密钥:创建一个 DPAPI 密钥设置器应用程序以获取基于文本的主密钥,通过 DPAPI 进行加密,然后将加密的输出保存到服务器上的文本文件中。这是我每次将站点移动到新服务器时都会执行的一次性任务。主密钥将用于执行 AES 加密。

  2. 当新用户注册时:

    2.1。保存密码数据/密码数据的哈希值。

    2.2. 加载主密钥文件,使用 DPAPI 解密密钥。使用解密的主密钥和每个用户数据的新随机 IV 来创建一个 AES 加密的字符串。通过在加密字符串前加上相应的随机 IV 来保存每个加密字符串,并插入到数据库中的 varchar 列中。

  3. 用户登录后:

    3.1。匹配密码哈希以验证用户。

    3.2. 对于每个加密的用户数据字段,将内容分成两部分:IV 和加密数据。从 DPAPI 和 IV 中获取主密钥,解密数据并在屏幕上显示。

听起来怎么样?以上有什么明显的缺陷吗?

我是新手,以前曾使用过企业库安全性来处理这类东西(.NET 核心中不再提供它!),所以任何帮助都将不胜感激!

0 投票
1 回答
778 浏览

c# - 为特定用户执行 X509Certificate 构造函数需要 >6 秒

我开发了一个使用 TLS/SSL 进行通信的 C#、.NET4.5.2 客户端/服务器系统。证书是从文件中加载的。我使用“MakeCert”实用程序创建了证书文件以创建 .pvk 和 .cer 文件,然后使用“pvk2pfx”实用程序将它们组合成 .pfx。

要使用证书,我使用带有重载的 X509Certificate2 构造函数来加载它们,以将文件路径和密码作为字符串传递:

我注意到随着时间的推移,证书的加载变得非常缓慢。我不确定是否存在使它们变慢的“事件”,或者是否是渐进的,但现在加载 PFX 文件大约需要 6 秒。加载 CER 文件没有问题,大约需要 0.1 秒。

我正在运行 Windows 8.1,问题仅在于我的用户在笔记本电脑上登录。

我编写了以下测试应用程序来验证问题:

我请一些同事在他们的 PC 上运行该程序。我还尝试在虚拟机中运行,然后在我自己的笔记本电脑上设置一个新用户。在所有情况下,它在 ~0.1 秒内运行,但对于我的普通用户登录,它在 >6 秒内运行。

起初我没有在证书上调用“Reset()”,所以我认为某处的一些临时文件可能存在问题,所以我使用 procmon 来找出发生了什么。我发现在以下目录中创建了一些临时文件(尽管即使在没有调用 Reset() 的情况下,当应用程序退出时它们也会被整理):

只是为了确保我已尝试删除此目录中的文件,但没有任何区别。

使用 procmon 我可以看到在加载证书期间文件/注册表活动中有 2 个间隙,这在负载快速的系统中不会发生。首先是在它尝试使用“dpapi.dll”之后。第二个是在读取以下 'C:\Extend\$UsnJrnl:$J:$DATA' 之后。DPAPI.dll 是 Windows 数据保护的接口。后一个文件是用于记录文件更改的 NTFS 的 USN 日志。我不是这方面的专家,我不确定两者是否相关!

然后我尝试使用 API Monitor http://www.rohitab.com/apimonitor来观察系统调用。同样,我不是专家,但我通过拖网查看暂停之前发生的事情。那里有很多我不明白可能相关或不相关的内容,我欢迎对其中任何内容发表评论以帮助关注问题。

2 秒间隔之前的最后一次调用是一个 memcpy,其调用堆栈如下:

更高的可能有趣的线路似乎是:

我发现很难跟踪调用堆栈,但我认为这些最终来自一个名为 CryptQueryObject 的函数。

我发现以下可能相关但不是 Windows8.1 的文章。我删除了 %windir%\Temp 文件夹以防万一,但也没有帮助。

https://support.microsoft.com/en-gb/kb/931908

我记得在某处发现一篇文章暗示延迟可能与来自 CryptQueryObject 的 ActiveDirectory 调用有关,但我找不到链接。

我真的在寻找:

  1. 如何修复我的用户登录,以便加载证书不需要 6 秒
  2. 如何确保我的代码没有问题,这样它就不会再次发生或发生在其他使用系统的人身上

谢谢你的帮助。

0 投票
1 回答
322 浏览

c# - 使用 DPAPI 加密而不泄露未加密数据的长度?

使用 Windows 数据保护 API,可以加密内存中的数据,如以下代码所示:

请参阅此处的 Microsoft 参考:https ://msdn.microsoft.com/en-us/library/ms995355.aspx

但是,此示例中的加密数据与原始数据的大小相同。有没有办法利用 DPAPI 加密数据而不泄露原始文件的文件大小?例如,将生成的密文隐藏在密钥内的“随机”位置,尽可能使用一次性密码?

0 投票
2 回答
632 浏览

c# - 来自不同用户的 DPAPI ProtectData

我正在使用 DPAPIProtectData如下:

让我们假设现在 temp 看起来像:

我想从 .exe 文件以及我的 WebService (IIS) 执行此代码。
问题是,如果我从 exe 运行代码,则当前用户是MyDomain/Administrator,如果我从 WebService 运行代码,则当前用户是IIS APPPOOL/MyApp.

我该如何解决这个问题?我正在尝试从WebService.exe 文件运行,如下所示:

但是由于某种原因它不起作用(我可以完全访问我的 iis 应用程序),无论如何我认为这不是这种情况下的正确解决方案。

注意:出于安全原因,我无法从更改DataProtectionScope.LocalMachineDataProtectionScope.CurrentUser

0 投票
1 回答
566 浏览

c# - 在服务器之间共享 DPAPI 密钥?

我有一个在 .NET 4.5.1 上运行的 ASP.NET WebForms 应用程序,并且一直在使用 FormsAuthentication API 的基于 cookie 的身份验证(但是不使用 Identity API;相反,我“手动”管理用户和会话)。此应用程序在多个服务器上运行,为了使 cookie 在所有服务器上工作,我已将 web.config 文件中所有服务器的机器密钥设置为相同的值。

为了能够与在 .NET Core 1.0 上运行的 MVC 应用程序共享身份验证 cookie,我正在从 FormsAuthentication API 转移到基于 Katana/OWIN 的 cookie 身份验证。虽然我已经按照https://github.com/blowdart/idunno.CookieSharing上的步骤在单台机器上进行了身份验证和共享 cookie,但我不确定如何在服务器之间共享密钥。所有示例都通过指向包含密钥文件的路径来设置基于 cookie 的身份验证。如果我能够手动生成密钥并将其复制到所有服务器,这将起作用。但是,我不知道如何生成这些密钥文件(以及文档似乎没有提到如何做到这一点)。正如一些示例所表明的那样,将密钥文件放在共享文件夹中是不可能的,因为服务器位于完全独立的网络上(这可能会在未来发生变化,但不是现在)。

有没有办法通过我的设置在多个服务器之间共享密钥(即不可能共享文件夹)?

0 投票
4 回答
975 浏览

windows-server-2012-r2 - DPAPI NG - NCryptProtectSecret 返回 NTE_ENCRYPTION_FAILURE

我正在尝试使用 DPAPI-NG 加密数据,但在执行NCryptProtectSecret时失败,它返回:

0x80090034 (NTE_ENCRYPTION_FAILURE)

我用本地用户 SID创建了NCryptCreateProtectionDescriptor :

然后我使用这个描述符实例作为NCryptProtectSecret的输入,但它不起作用。

如果我使用以下保护描述符:

一切似乎都很好,但它不适用于用户或组的 SID。我已经在 Windows Server 2012R2 和 Windows Server 2016 上对此进行了测试。

任何想法?

这是一个代码示例:

0 投票
2 回答
1135 浏览

c# - ProtectedData.Unprotect 用户更改密码后

我有一个 C# 应用程序,它使用ProtectedData类将密码信息存储在数据库中。我使用的范围local machine和据我所知它将DPAPI用于master key加密它,除非我卸载操作系统,否则它不会被更改。

假设我想使用 scope DataProtectionScope.CurrentUser。据我了解,它使用不同 master key的受用户密码保护的。因此,当用户更改密码时,用于保护数据的主密钥保持不变,而只是更改了保护数据的密码。

我的问题是:用户更改密码后,我的数据(在数据库中)是否可检索(以及如何检索)?

0 投票
1 回答
320 浏览

c# - DPAPI - 用户 A 创建的加密数据,用户 B 无法解密

我开发了一个主要的应用程序来控制灯光。现在我想在客户端站点中部署这个应用程序。我将向客户端发送一个包含加密文件(密钥)和用户名(始终为 defadmin)的文件,以便首次登录应用程序。创建了一个独立的应用程序,该应用程序在当前用户范围内使用 DPAPI 生成加密的密钥文件。现在,我想在我的主应用程序中使用 DPAPI 实现解密代码,以验证客户端是否可以访问应用程序。我面临的问题是我(当前用户)创建的加密密钥文件不会被客户端(谁是 defadmin)解密。我找到了一个使用漫游用户配置文件和隔离存储的修复程序,我不太确定如何即使在阅读 MSDN 文章后也可以实施。还,我阅读了用户隔离,并且在内联网上允许组装,但在互联网上不允许组装。这是否意味着将漫游用户配置文件存储在网络中的某个位置并允许客户端访问?请提供帮助以解决此问题,如果您能提供一些示例代码片段,我们将不胜感激。