加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 创建密钥而不将其写入磁盘?

发布时间:2020-12-15 22:04:36 所属栏目:百科 来源:网络整理
导读:前言 我正在深入研究.Net x509certificate2和x509certificate对象,注意到默认情况下两个证书类都将私钥序列化为磁盘,因为使用默认选项集在x509certificate2和x509certificate类的构造函数中可验证地使用了Persist-Key选项对于不包含CspProviderFlags.CreateE
前言

我正在深入研究.Net x509certificate2和x509certificate对象,注意到默认情况下两个证书类都将私钥序列化为磁盘,因为使用默认选项集在x509certificate2和x509certificate类的构造函数中可验证地使用了Persist-Key选项对于不包含CspProviderFlags.CreateEphemeralKey的CspProviderFlags.这可以通过任何数量的网站进行验证,这些网站显示.Net的来源以及resharper的副本,如果您自己选择这样做的话.

事实上,实际上这些.Net对象似乎只是一个中央旧式crypto32.dll加密上下文的包装器.令我担心的是,我更深入地查看代码,我发现它似乎明确地在磁盘文件存储中查找x509certificate2和x509certificate对象上的PublicKey字段的getter和setter中的公钥和私钥.尽管事实上,我会希望它们只存在于内存中.根据这些知识,它似乎将我的私钥存储在此存储中,即使我不希望它这样做,因为构造函数不允许您更改此选项并根据我看到的构造函数列表将其关闭看看文档;因此,如果您从PrivateKey字段设置()或get(),它实际上只是从幕后的文件存储中收集它.

我的问题的原因

我认为被迫将我的私钥泄露到文件系统 – 甚至暂时 – 是一个巨大的安全问题,所以我不想这样做.我也不相信证书商店.即使你不同意我,我个人认为即使我不打算将我的私钥序列化到磁盘也是一个巨大的安全问题,所以我不想这样做.

目标

我目前的目标是简单地能够在C#中生成RSA公共和私有X509密钥,可以在Windows上使用,而不需要强制将它们写入硬盘作为创建过程的一部分,而且我找不到很多有效的密钥我能找到的所有选项似乎都有隐藏的差距或众所周知的问题.

我们的目标不是永远不要将它们写入磁盘,只是不这样做,除非它使用我编写的代码并且知道它是安全的,以确保它们在静止时完全加密;也就是说,它不应该这样做,除非我在密钥本身完全加密后明确要求它.

目标tldr;

简而言之:我想在Windows上使用C#编写安全软件来生成509证书,该证书不会强制我导出,导入或以其他方式将我的私钥泄露到文件系统作为证书创建的一部分.我希望能够使用尽可能少的第三方代码在Windows上创建自己的X509Certificates.

我考虑过的选项

>所述的标准.Net类型已经深入研究,并且由于上述问题而被发现缺乏.我只是没有足够的访问内部CSP设置,因为构造函数和访问不会公开它们,并且默认值被用作我个人认为不安全的东西.
> Bouncy Castle库起初看起来是一个不错的选择,但它主动将我的公钥和私钥暴露给文件系统只是正常的.net类型在将它们转换为标准.Net类型时所做的事情,因为这些对象存储了场景没有问BC是否可以先行..
>我试图找到一个crypto32.dll p-invoke选项,它允许我不对我的键进行序列化,只是发现即使我不想要它们,我所能找到的所有内容都是如此.并且在其上查找数据非常困难所以我大多只是查看源代码才发现它似乎不喜欢我试图不存储密钥.
>尽管花了几天时间研究这个话题,但我找不到任何其他选择.甚至Stack Overflow也表示在大多数情况下使用BC或原生类型;但这并没有解决我的问题.

如果没有执行以下任何操作,我将如何最好地创建自己的X509证书,因为我觉得它们都是安全问题:

> makecert.exe的使用要求我允许我的进程在服务器上执行权限,以便它可以启动进程;那是一个等待发生的安全问题.更不用说,我无法审核代码,我愿意打赌它仍然将密钥存储在证书库中,即使我不希望它们存在.
>使用C#/ .net x509certificate2和x509certificate对象默认通过调用证书存储区将生成的公钥序列化到磁盘,这样就不是一个选项;我的目标是以安全的方式做事,因此我生成的所有私钥的概念都存储在磁盘上,供任何人访问它们并不会让我感觉良好.并且很难在证书商店中找到数据;因此,我无法验证其安全性,不得不认为它不是一个有效的选择.
>使用诸如Bouncy Castle之类的第三方库可以创建更新场景以及必须信任第三方的可能性,从而创建更大的攻击面;可悲的是,他们都使用受我个人称之为“隐藏的私钥存储”问题的相同转换,他们试图通过使用具有此泄漏密钥的相同对象来使用标准System.Security.Cryptography API.问题.因此,如果一般情况下我们希望保持系统尽可能安全……那种泄漏不是一种选择.

解决方法

如果不进行超低级别(或完全禁用分页),则无法保证您的私钥材料永远不会写入磁盘,因为它总是可以被分页.即使这样,在支持休眠的系统上,您的密钥也将出现在休眠文件中.

crypt32密钥存储机制使用DPAPI(用户或计算机作用域,具体取决于您在PFX中的导入标志和/或标志)来加密静态的密钥材料.因此,虽然它涉及文件系统,但它并不“存储在磁盘上,只供任何人访问它们”;除非它们像你一样运行,或者有权访问系统密钥.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读