如何检查 .NET 中是不是存在 RSA 密钥容器

Posted

技术标签:

【中文标题】如何检查 .NET 中是不是存在 RSA 密钥容器【英文标题】:How to check if RSA key container exists in .NET如何检查 .NET 中是否存在 RSA 密钥容器 【发布时间】:2011-05-12 14:24:02 【问题描述】:

我们有

    Dim cp As New CspParameters()
    cp.KeyContainerName = ContainerName
    cp.Flags = CspProviderFlags.UseMachineKeyStore

如果带有 ContainerName 的密钥不存在,如何确保不创建新密钥?

【问题讨论】:

【参考方案1】:

试试这个:

    public static bool DoesKeyExists(string containerName)
    
        var cspParams = new CspParameters
        
            Flags = CspProviderFlags.UseExistingKey,
            KeyContainerName = containerName
        ;

        try
        
            var provider = new RSACryptoServiceProvider(cspParams);
        
        catch (Exception e)
        
            return false;
        
        return true;
    

【讨论】:

这不是很好,因为它假定一般异常意味着它不存在,这不是好的做法。但是,据我所知,这似乎是唯一的方法。 将标志切换为 Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore 为我工作。【参考方案2】:

这是我们用来测试给定容器名称的 powershell 脚本:

# Test if an rsa key container exists on this system.
function Test-RsaKeyContainerName(
    [Parameter(Mandatory=$true)][string] $ContainerName,
    [Parameter(Mandatory=$false)][switch] $UserContainer = $false
) 
    $csp = New-Object -TypeName "System.Security.Cryptography.CspParameters";
    $csp.KeyContainerName = $ContainerName;
    if (!($UserContainer)) 
        $csp.Flags = [System.Security.Cryptography.CspProviderFlags]::UseMachineKeyStore;
    
    $csp.Flags = $csp.Flags -bor [System.Security.Cryptography.CspProviderFlags]::UseExistingKey;
    try 
        $rsa = New-Object -TypeName "System.Security.Cryptography.RSACryptoServiceProvider" -ArgumentList ($csp);
     catch [System.Management.Automation.MethodInvocationException] 
        if ($error[0].Exception.InnerException -ne $null -and
            $error[0].Exception.InnerException.GetType() -eq [System.Security.Cryptography.CryptographicException] -and
            $error[0].Exception.InnerException.Message.StartsWith("Keyset does not exist"))            
            return $false;
         else 
            throw;
               
    
    return $true;

如果你确实需要枚举系统上安装的密钥,可以在http://www.jensign.com/dotnet/keypal/source/KeyPal.txtKeyPal借用代码

【讨论】:

由于 jensign 页面已经消失,您可以使用 repo 链接更新吗? 更新了 jensign.com 的断开链接【参考方案3】:

你可以使用

.PersistKeyInCsp = false

在您的加密提供商上,这将确保密钥不会留在容器中。这是你的意思吗?

【讨论】:

不是一个好主意,如果密钥在进程开始之前就存在,它将被删除。

以上是关于如何检查 .NET 中是不是存在 RSA 密钥容器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用pkcs11接口读取证书的密钥进行RSA

如何配置GitLab中的SSH key

如何检查以下响应中是不是存在数据密钥?

如何检查 Perl 的哈希中是不是存在密钥? [复制]

如何检查密钥是不是存在于深层 Perl 哈希中?

如何从 RSA 机器级容器中检索私钥?