问题标签 [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.
c# - .NET wrapper for DPAPI-NG and user group access configuration
I have a number of workstations which are part of my domain, each running some .NET application. One central server stores secrets which I would like to be encrypted by a key which is accessible to all users of the system which have the appropriate user group.
I found that .NET does offer a wrapper for DPAPI, but I was wondering if the same applies for DPAPI-NG, where a wrapper function exists for NCryptProtectSecret and NCreatProtectionDescription. Furthermore, how would I go about configuring the descriptor, so as to only allow a specific user group from my domain to decrypt the secret?
In case there is no wrapper I'd have to import the ncrypt.dll and work with that. Can anyone who has experience with this library confirm that this URL has an up-to-date API https://msdn.microsoft.com/en-us/library/windows/desktop/hh706795(v=vs.85).aspx?
iis - IIS - AddDataProtection PersistKeysToFileSystem 未创建
我正在开发一个 asp.net 核心应用程序以在网络上进行调优,并且我正在使用“AddDataProtection”来保护静态密钥加密,就像文档建议的那样,但是当我部署我的应用程序并直接从 IIS 运行时AppPool 身份,从未创建密钥,并且我在 DpapiNG Windows 日志中收到错误。
我的代码如下:
从 Visual Studio 调试,一切运行良好,但我在管理员权限下运行 VS,所以这里的权限不是问题。
我已经尝试将 AppPool App 用户的权限添加到它直接从 MMC 自己获得的私钥,但它没有工作,甚至授予了对该位置的完整路径的权限,如果密钥应该按照此处所述https:/ /docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview(检查第一条评论)但它也没有奏效。
我只能通过将 AppPool 设置为以管理员身份运行来使其工作,但显然这是不行的,我只是想确保这是某个地方的权限问题。
有没有人遇到同样的问题可以提供帮助?
问候,安德烈
c# - DPAPI - 为另一个用户加密?
可能安全性是一个更合适的位置,但我会先在这里问。
如果我想使用 DPAPI 加密一些明文,我有两个范围选项,CurrentUser 和 LocalMachine。假设我想加密需要另一个用户解密的数据,有没有办法使用 .NET 中的一些函数来做到这一点?
如果 ProtectedData.Protect 方法有重载,那就太好了,例如:
whereUserInformation
只是一个具有域、用户名和密码属性的 POCO。
这里的用例是在登录(交互式)用户以外的帐户的支持下运行的服务或计划任务,但这需要由另一个用户安装。
我可以编写一个实用程序来加密字符串,然后使用 RunAs 功能来运行它,但除此之外还有其他方法 - 如果我有用户的域、用户名和密码 - 做我需要的事情吗?
c# - 从不同机器访问时“密钥在指定状态下无效”(DPAPI)错误
我们使用 Cryptography.ProtectedData.protect 和 Cryptography.ProtectedData.Unprotect 进行加密。范围是 DataProtectionScope.LocalMachine。
该应用程序托管在共享驱动器上。当用户从他们自己的计算机访问应用程序时,它将加密一个配置文件,该文件从此时起适用于该用户。但是,此后,如果任何其他用户在此共享驱动器上从他们自己的计算机访问应用程序,则会收到错误: 密钥在指定状态下无效
似乎当您从 A 计算机远程访问应用程序时,它认为本地计算机是 A 计算机,而不是托管应用程序的计算机。
感谢您提供任何信息
encryption - DPAPI 密钥存储和恢复
鉴于即将出台的 GDPR 法规,我工作的公司正在考虑升级他们的加密算法并加密比以前更多的数据。作为被指定处理此问题的人,我已经用 AES-256 替换了我们旧的 CAST-128 加密(我说加密,但它更像是散列,没有盐,并且每次都产生相同的密文),并编写了工具来迁移数据。但是,加密密钥仍然在应用程序中进行硬编码,并且可以在几分钟内使用反汇编程序提取。
我们的产品是一个桌面应用程序,我们的大多数客户都在内部安装了它。他们中的大多数人还托管自己的数据库。由于他们在本地拥有整个产品,因此保护密钥似乎是一项非常困难的任务。
经过一番研究,我决定采用以下方法。在安装过程中,将为每位客户生成一个随机的 256 位密钥,并用于使用 AES 加密对其数据进行加密。然后,密钥本身将在用户模式下使用 DPAPI 进行加密,其中唯一可以访问数据的用户将是新创建的具有有限权限的锁定域服务帐户,该帐户无法实际登录机器。加密的密钥将存储在注册表的 ACL ed 部分中。然后,加密模块将模拟该用户来执行其功能。
问题是,由于密钥将在安装时随机生成,并立即加密,因此我们也不会拥有它。如果客户碰巧删除了这个帐户,重新安装了服务器操作系统,或者以其他方式设法丢失了密钥,则数据将无法恢复。所以在所有的阐述之后,真正的问题来了:
我正在考虑让客户备份存储密钥的注册表,并假设即使在重新安装或删除用户之后,只要在同一台机器上使用相同的密码创建相同的用户帐户,它就会创建相同的DPAPI 机密并能够解密密钥。但是,我不知道是否是这种情况,因为我不确定这些秘密是如何产生的。谁能确认这是否真的如此?如果您能想到更好的方法,我也愿意接受有关完全不同的密钥存储方法的建议。
dpapi - 如何检查和阅读我使用 DP API 生成的主密钥
该查询与 DP API 功能有关。我正在使用 DP API Protect 和 Unprotect 方法用秘密熵加密我的字符串。根据互联网上可用的信息,主密钥最初由 DP API 生成,存储在 Appdata\roaming\Microsoft\protect[SID]\" mymasterkeyfile " 中。在程序执行时,我的系统上会生成 SID 文件夹,但我无法找到主密钥文件。我不知道为什么?我是新手,所以无法理解这个问题。
任何帮助表示赞赏,谢谢..
encryption - 是否可以基于 Active Directory(或其他 SSO)身份验证来保护机密?
我有一个应用程序,理想情况下,用户将使用 AD 登录。我还需要为每个用户存储一个加密密钥,在存储之前应该对其进行加密。
AD、kerberos 或任何社交 SSO 提供的任何机制是否可以根据我的身份验证/授权给我一个秘密,我可以使用它来加密密钥?
或者,任何类似于 DPAPI 但可以跨设备可靠工作的 API?
最后,在 AD 中存储未加密的加密密钥是否被认为是不好的做法?在我看来,bitlocker 正在有效地做到这一点。
c# - Asp.Net Core Data Protection System 能否检测到配置已更改并生成新密钥?
我正在创建一个新的 asp.net core 2 网站,该网站根据本文使用数据保护。作为第一遍,我在没有保护密钥的情况下创建了它(因为我们还没有投入生产),例如
正如预期的那样,这在我们的测试环境中生成了不受保护的密钥。接下来,我添加了ProtectKeysWithCertificate
扩展名,以便对所有新生成的密钥进行加密,例如
然而,我遇到的问题正是......它只是加密新密钥。它很高兴使用原始的非加密密钥,因为它从未被撤销,而且它的到期时间是几个月后。
asp.net 有没有办法检测数据保护的配置已更改并生成新密钥?
本文建议,如果我们需要在预定滚动时间之前启动设置以进行调用,IKeyManager.CreateNewKey
但我不希望每次应用程序启动时都发生这种情况。
正如我所说,这还没有投入生产,所以我确实有从我们的测试环境中手动删除密钥的后备选项,但我很想知道是否还有其他方法。
c++ - CryptProtectData 中的不同结果
我试图通过在 C++ 上使用 CryptProtectData 来加密解密的信息。但结果我得到了不同的结果。我的代码:
在控制台中我得到:
你好世界.LMEM
我注意到每次启动程序时我都会得到不同的结果。为什么?
c# - ASP.NET Core 2.1 中的数据保护仅适用于一台机器
我正在使用ASP.NET Core 数据保护系统使用应用程序 A 加密数据并使用应用程序 B 对其进行解密。
在开发机器上运行时,加密和解密都可以工作,但是当应用程序 B 移动到生产机器时,它不再能够解密,因为IDataProtector.Unprotect方法会引发异常:
System.InvalidOperationException:密钥环不包含有效的默认保护密钥。数据保护系统无法创建新密钥,因为密钥的自动生成已禁用。
这是我用来在应用程序 B 中配置解密的代码:
生产机器确实包含相同的密钥文件夹(带有 .pfx 和 .xml 文件)和安装在 Windows 证书存储中的相同密钥。
据我了解,通过向数据保护系统提供证书文件,它应该可以在任何机器上运行,而不是绑定到特定机器或 Windows 用户。这个假设是不正确的,还是我执行解密的方式有问题?
以下是一些更详细的日志记录消息:
2018-06-13 16:32:32.6750 | TRACE | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector | 5 | Performing unprotect operation to key {846541...} with purposes ('My Application', 'My Purpose').
2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository | 37 | Reading data from file 'C:\inetpub\wwwroot\My Website\Keys\key-846541....xml'.
2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager | 18 | Found key {846541...}.
2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 13 | Considering key {846541...} with expiration date 2038-01-18 20:54:13Z as default key.
2018-06-13 16:32:32.6750 | DEBUG | Microsoft.AspNetCore.DataProtection.TypeForwardingActivator | Forwarded activator type request from Microsoft.AspNetCore.DataProtection.XmlEncryption.EncryptedXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=2.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.XmlEncryption.EncryptedXmlDecryptor, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60
2018-06-13 16:32:32.7051 | ERROR | Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager | 24 | An exception occurred while processing the key element '<key id="846541..." version="1" />'. Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Keyset does not exist
2018-06-13 16:32:32.7051 | TRACE | Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager | 25 | An exception occurred while processing the key element '<key id="846541..." version="1" />...
2018-06-13 16:32:32.7051 | WARN | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 12 | Key {846541...} is ineligible to be the default key because its CreateEncryptor method failed. Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Keyset does not exist
2018-06-13 16:32:32.7051 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 14 | Key {846541...} is no longer under consideration as default key because it is expired, revoked, or cannot be deciphered.
2018-06-13 16:32:32.7051 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver | 53 | Repository contains no viable default key. Caller should generate a key with immediate activation.
2018-06-13 16:32:32.7051 | DEBUG | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider | 57 | Policy resolution states that a new key should be added to the key ring.
2018-06-13 16:32:32.7051 | ERROR | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider | 49 | The key ring does not contain a valid default key, and the key manager is configured with auto-generation of keys disabled.
2018-06-13 16:32:32.7051 | ERROR | Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider | 48 | An error occurred while reading the key ring. System.InvalidOperationException: The key ring does not contain a valid default protection key. The data protection system cannot create a new key because auto-generation of keys is disabled.