使用RSACryptoServiceProvider生成RSA密钥时的持久性错误

欣快的

RSACryptoServiceProvider多次调用以创建私钥/公钥对时,我遇到了奇怪的错误问题

class Program
{
    static void Main(string[] args)
    {
        try
        {
            CreateKey();
        }
        catch (Exception e)
        {
            Console.WriteLine("First failure:"+ e);
        }

        try
        {
            CreateKey();
        }
        catch (Exception e)
        {
            Console.WriteLine("Second failure:" + e);
        }
    }

    private static void CreateKey()
    {
        var cp = new CspParameters
        {
            KeyContainerName = "ContainerKey.1"
        };
        using (var rsa = new RSACryptoServiceProvider(cp) { PersistKeyInCsp = false })
        {
            Console.WriteLine(rsa.ToXmlString(true));
            Console.WriteLine(rsa.ToXmlString(false));
            rsa.Clear();
        }
    }
}

执行以上代码的输出是(省略我的话):

<RSAKeyValue>[Private key content omitted]</RSAKeyValue>
<RSAKeyValue>[Public key content omitted]</RSAKeyValue>
Second failure:System.Security.Cryptography.CryptographicException: Keyset as registered is invalid.

   at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
   at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
   at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
   at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
   at System.Security.Cryptography.RSACryptoServiceProvider..ctor(CspParameters parameters)
   at RsaTest.Program.CreateKey() in C:\Users\RF185104\source\repos\RsaTest\RsaTest\Program.cs:line 39
   at RsaTest.Program.Main(String[] args) in C:\Users\RF185104\source\repos\RsaTest\RsaTest\Program.cs:line 25

运行上面的代码,第一次调用CreateKey可以正常工作,但是第二次调用失败。现在,再次重新运行代码时,即使是第一次也失败了,这意味着某些地方仍然存在。但这不应该发生,因为设置PersistKeyInCsp为false应该可以防止密钥的持久性。更改KeyContainerName原因会使呼叫再次起作用,但只能起作用一次。然后,下一个呼叫也会失败。

我相信我对RSACryptoServiceProvider工作原理有很大的误解,因为我不知道上面的错误怎么会发生。

该代码的主要目的是创建一个RSA密钥对,而不将其持久化到本地存储中,因此在同一用户上运行的其他应用程序将无法访问它。

运行Windows 10的.NET Framework 4.7.2在调试和发行中均会发生。

主题

我们的产品在生产中遇到了同样的问题。事实证明,McAfee AntiVirus是造成此问题的原因。它将此消息记录到应用程序事件日志中

usernameprocess name,这尝试访问... \应用程序数据\漫游\ MICROSOFT \ CRYPTO \ RSA \ Windows SID\ randomish folder name,违反规则的“恶意软件行为:EFS的Windows滥用”,并被阻止。有关如何响应此事件的信息,请参见KB85494。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Redis中使用持久性时,密钥到期是否尊重原始时间?

仅在持久性为null时如何生成ID

使用Java查找最多三个整数时出现的持久性编译错误

持久性时出现JPA ManyToMany错误

使用RSACryptoServiceProvider的错误密钥异常

“找不到持久性单元”错误

休眠和持久性。注释错误

通过Intellij Hibernate持久性工具生成模型时,Relationship References分解表

安全持久性和加密密钥的IPC

多个持久性单元抛出错误,未找到持久性错误,Spring + JPA

何时使用“静态”作为持久性

春季启动:无法使用持久性

如何使用Redis禁用持久性?

尝试启用离线持久性时,Firebase给出错误

在Ignite持久性中用作POJO策略时,Scala案例类构造函数错误

卸载本地软件包时,什么会导致持久性错误?

持久性单元错误更多2个EntityManagers 1个持久性单元?

尝试运行JUnit测试时,为什么会出现“在使用ClassLoader搜索持久性归档时抛出异常”错误?

TempData持久性

尝试在elasticsearch-dsl.py持久性api中使用Date时发生异常

使用Spring时如何注入多个JPA EntityManager(持久性单元)

使用内存映射文件或纯Stream.Write时是否有任何持久性保证

使用会话+ Redis持久性时无法获取主体/身份验证

在程序开始时使用持久性 cookie 初始化 Dio

Java,代码生成和持久性框架

Intellij Idea:为Hibernate生成持久性映射

Dropwizard Hibernate无法找到持久性错误

Haskell堆栈持久性错误,找不到-llibpq

在Fluent NHibernet中获取“没有持久性”错误