Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security CngKey为机器密钥分配权限_Security_Encryption_Cng - Fatal编程技术网

Security CngKey为机器密钥分配权限

Security CngKey为机器密钥分配权限,security,encryption,cng,Security,Encryption,Cng,我已经创建了一个机器范围的CngKey(MachineKey=true),但我的应用程序无法访问它 如何向分配权限,以便我的应用程序池可以访问密钥?最好是实用的,这样我就可以将它构建到安装程序中 Powershell创建脚本: [System.Security.Cryptography.CngKeyCreationParameters] $cngKeyParameter = [System.Security.Cryptography.CngKeyCreationParameters]::new

我已经创建了一个机器范围的CngKey(MachineKey=true),但我的应用程序无法访问它

如何向分配权限,以便我的应用程序池可以访问密钥?最好是实用的,这样我就可以将它构建到安装程序中

Powershell创建脚本:

[System.Security.Cryptography.CngKeyCreationParameters] $cngKeyParameter =  [System.Security.Cryptography.CngKeyCreationParameters]::new()
    $cngKeyParameter.KeyUsage = [System.Security.Cryptography.CngKeyUsages]::AllUsages
    $cngKeyParameter.ExportPolicy = [System.Security.Cryptography.CngExportPolicies]::AllowPlaintextExport

    $cngKeyParameter.Provider = [System.Security.Cryptography.CngProvider]::MicrosoftSoftwareKeyStorageProvider
    $cngKeyParameter.UIPolicy = [System.Security.Cryptography.CngUIPolicy]::new([System.Security.Cryptography.CngUIProtectionLevels]::None)
    $cngKeyParameter.KeyCreationOptions = [System.Security.Cryptography.CngKeyCreationOptions]::MachineKey

    #Create Cng Property for Length, set its value and add it to Cng Key Parameter
    [System.Security.Cryptography.CngProperty] $cngProperty = [System.Security.Cryptography.CngProperty]::new($cngPropertyName, [System.BitConverter]::GetBytes(2048), [System.Security.Cryptography.CngPropertyOptions]::None)
    $cngKeyParameter.Parameters.Add($cngProperty)

    #Create Cng Key for given $keyName using Rsa Algorithm
    [System.Security.Cryptography.CngKey] $key = [System.Security.Cryptography.CngKey]::Create([System.Security.Cryptography.CngAlgorithm]::Rsa, "MyKey", $cngKeyParameter)

CNG密钥的权限有点间接

如果您知道要应用的完整权限集,可以在创建时执行(抱歉,您必须将C#转换为PowerShell):

CryptoKeySecurity sec=new CryptoKeySecurity();
第2.2节:访问规则(
新的加密密钥访问规则(
新的安全标识符(WellKnownSidType.BuiltinAdministratorsSid,null),
CryptoKeyRights.FullControl,
AccessControlType.Allow);
第2.2节:访问规则(
新的加密密钥访问规则(
新安全标识符(WellKnownSidType.NetworkServiceSid,null),
CryptoKeyRights.GenericRead,
AccessControlType.Allow);
常量字符串NCRYPT_SECURITY_DESCR_PROPERTY=“SECURITY DESCR”;
const CngPropertyOptions DACL_SECURITY_INFORMATION=(CngPropertyOptions)4;
CngProperty权限=新建CngProperty(
NCRYPT_SECURITY_DESCR_财产,
第节GetSecurityDescriptorBinaryForm(),
CngPropertyOptions.Persist | DACL_安全信息);
cngKeyParameter.Parameters.Add(权限);
如果要在以后附加规则(例如在使用默认权限创建规则之后):

CngProperty prop=key.GetProperty(NCRYPT\u SECURITY\u DESCR\u属性、DACL\u SECURITY\u信息);
CryptoKeySecurity sec=新的CryptoKeySecurity();
第二节SetSecurityDescriptorBinaryForm(prop.GetValue());
第2.2节:访问规则(
新的加密密钥访问规则(
新安全标识符(WellKnownSidType.NetworkServiceSid,null),
CryptoKeyRights.GenericRead,
AccessControlType.Allow);
CngProperty newProp=新的CngProperty(
道具名称,
第节GetSecurityDescriptorBinaryForm(),
CngPropertyOptions.Persist | DACL_安全信息);
key.SetProperty(newProp);

CNG密钥的权限有点间接

如果您知道要应用的完整权限集,可以在创建时执行(抱歉,您必须将C#转换为PowerShell):

CryptoKeySecurity sec=新的加密密钥安全性();
第2.2节:访问规则(
新的加密密钥访问规则(
新的安全标识符(WellKnownSidType.BuiltinadAdministratorsSid,null),
CryptoKeyRights.FullControl,
AccessControlType.Allow);
第2.2节:访问规则(
新的加密密钥访问规则(
新安全标识符(WellKnownSidType.NetworkServiceSid,null),
CryptoKeyRights.GenericRead,
AccessControlType.Allow);
常量字符串NCRYPT_SECURITY_DESCR_PROPERTY=“SECURITY DESCR”;
const CngPropertyOptions DACL_SECURITY_INFORMATION=(CngPropertyOptions)4;
CngProperty权限=新建CngProperty(
NCRYPT_SECURITY_DESCR_财产,
第节GetSecurityDescriptorBinaryForm(),
CngPropertyOptions.Persist | DACL_安全信息);
cngKeyParameter.Parameters.Add(权限);
如果要在以后附加规则(例如在使用默认权限创建规则之后):

CngProperty prop=key.GetProperty(NCRYPT\u SECURITY\u DESCR\u属性、DACL\u SECURITY\u信息);
CryptoKeySecurity sec=新的CryptoKeySecurity();
第二节SetSecurityDescriptorBinaryForm(prop.GetValue());
第2.2节:访问规则(
新的加密密钥访问规则(
新安全标识符(WellKnownSidType.NetworkServiceSid,null),
CryptoKeyRights.GenericRead,
AccessControlType.Allow);
CngProperty newProp=新的CngProperty(
道具名称,
第节GetSecurityDescriptorBinaryForm(),
CngPropertyOptions.Persist | DACL_安全信息);
key.SetProperty(newProp);

谢谢bartonjs。我按照你的建议添加了权限。它执行时没有错误。但我仍然无法访问它。我用这个密钥加密一个始终加密的数据库。主加密密钥创建时没有错误,但当我尝试创建列加密密钥时,出现以下错误:“打开Microsoft Cryptography API时出错:下一代(CNG)密钥:“Microsoft软件密钥存储提供程序/CNG_测试”。请验证CNG提供程序名称“Microsoft软件密钥存储提供程序”是否有效,是否已安装在计算机上,以及密钥“CNG_测试”是否存在。“@Swifty听起来像是在寻找用户密钥。但是,如果权限更改现在起作用,您就陷入了一个SqlServer特有的问题,我无法帮助您解决这个问题,这可能是另一个问题。是的,我相信您是对的。我能够使用您提供的代码添加一个变通方法。它允许我使用网络服务手动打开机器密钥,然后将其副本导入网络服务的密钥存储。这不是最好的解决方案,但在SQL允许使用机器密钥之前,它是唯一的解决方案。感谢您的帮助。@bartonjs-当使用与上述类似的访问规则时,管理员帐户的访问权限无法删除密钥,即使指定了FullControl。如果我生成了密钥,然后使用第二种方法,则该密钥保留了被管理员帐户删除的功能。您知道有什么明显的原因吗?对于任何试图在.Net5中使用该代码的人来说。您可以用FileSecurity/FileSystemAccessRule替换CryptoKeySecurity/CryptoKeyAccessRule,只要您使用Microsoft软件密钥存储提供程序(默认设置),它就可以正常工作。谢谢bartonjs。我按照你的建议添加了权限。它执行时没有错误。但我仍然无法访问它。我用这个密钥加密一个始终加密的数据库。主加密密钥创建时没有错误,但当我尝试创建列加密密钥时,出现以下错误:“打开Microsoft Cryptography API时出错:下一代(CNG)密钥:‘Microsoft软件密钥存储提供程序/CNG_测试’。请验证CNG提供程序名称‘Microsof’