DPAPI NG - NCryptProtectSecret返回NTE_ENCRYPTION_FAILURE

时间:2016-10-22 12:16:41

标签: windows-server-2012-r2 dpapi cng

我正在尝试使用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 个答案:

答案 0 :(得分:1)

将PlainText和PlainTextLength替换为Secret和SecretLength。

答案 1 :(得分:1)

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

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

[system.directoryservices.activedirectory.Forest]::GetCurrentForest().ForestMode

答案 2 :(得分:0)

我还没弄清楚问题是什么,但一切都在不同领域运作良好。微软还证实,我们发送给他们的工作示例是正确的,但他们没有解释问题所在。

答案 3 :(得分: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

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

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