3

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

0x80090034 (NTE_ENCRYPTION_FAILURE)

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

"SID=S-1-5-21-2942599413-360359348-3087651068-500"

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

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

"LOCAL=user"

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

任何想法?

这是一个代码示例:

SECURITY_STATUS Status;
PBYTE       ProtectedData = NULL;
ULONG       ProtectedDataLength = 0;
NCRYPT_DESCRIPTOR_HANDLE    DescriptorHandle = NULL;
LPCWSTR ProtectionDescString = L"SID=S-1-5-21-2942599413-360359348-3087651068-500";

Status = NCryptCreateProtectionDescriptor(
                                        ProtectionDescString,
                                        0,
                                        &DescriptorHandle
                                        );      
// Status is ERROR_SUCCESS (zero)


LPCWSTR SecretString = L"Some message to protect";
PBYTE Secret = (PBYTE)SecretString;
DWORD SecretLength = (ULONG)( (wcslen(SecretString)+1)*sizeof(WCHAR) );

Status = NCryptProtectSecret(
                        DescriptorHandle,
                        0,
                        PlainText,
                        PlainTextLength,
                        NULL, // Use default allocations by LocalAlloc/LocalFree
                        NULL, // Use default parent windows handle.
                        &ProtectedData,  // out LocalFree
                        &ProtectedDataLength
                        );

**// Status == NTE_ENCRYPTION_FAILURE**
4

4 回答 4

2

我遇到了这个问题,发现原因是我们的域在低于 2012 的功能级别上运行。将域升级到 2012 后问题得到解决。

确定功能级别的一种快速简便的方法是以下 PowerShell cmdlet

[system.directoryservices.activedirectory.Forest]::GetCurrentForest().ForestMode
于 2017-07-18T22:06:27.233 回答
1

将 PlainText 和 PlainTextLength 替换为 Secret 和 SecretLength。

于 2016-12-27T13:29:18.373 回答
0

检查运行应用程序的用户是否真的用户

S-1-5-21-2942599413-360359348-3087651068-500

您可以从命令提示符处对此进行测试:

>whoami /user

USER INFORMATION
----------------

User Name     SID
============= ============================================
erbium\zeljko S-1-5-21-2942599413-360359348-3087651068-500

NTE_ENCRYPTION_FAILURE当我尝试使用我实际上没有的组 SID(Domain Users组)时,我得到了。

与运行代码的人相比,您可能只是拥有错误的 sid。

于 2017-10-05T21:53:51.730 回答
0

我还没有弄清楚问题出在哪里,但是在不同的域中一切正常。微软还确认我们发送给他们的工作示例是正确的,但他们没有解释问题所在。

于 2017-04-05T13:46:42.913 回答