c# – 创建密钥而不将其写入磁盘?
前言
我正在深入研究.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设置,因为构造函数和访问不会公开它们,并且默认值被用作我个人认为不安全的东西. 题 如果没有执行以下任何操作,我将如何最好地创建自己的X509证书,因为我觉得它们都是安全问题: > makecert.exe的使用要求我允许我的进程在服务器上执行权限,以便它可以启动进程;那是一个等待发生的安全问题.更不用说,我无法审核代码,我愿意打赌它仍然将密钥存储在证书库中,即使我不希望它们存在. 解决方法
如果不进行超低级别(或完全禁用分页),则无法保证您的私钥材料永远不会写入磁盘,因为它总是可以被分页.即使这样,在支持休眠的系统上,您的密钥也将出现在休眠文件中.
crypt32密钥存储机制使用DPAPI(用户或计算机作用域,具体取决于您在PFX中的导入标志和/或标志)来加密静态的密钥材料.因此,虽然它涉及文件系统,但它并不“存储在磁盘上,只供任何人访问它们”;除非它们像你一样运行,或者有权访问系统密钥. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |