我正在深入研究.Net x509certificate2和x509certificate对象,注意到默认情况下两个证书类都将私钥序列化为磁盘,因为构造函数中可以使用Persist-Key选项进行验证x509certificate2和x509certificate类的使用为CspProviderFlags设置的默认选项,不包括CspProviderFlags.CreateEphemeralKey。这可以通过任何数量的网站进行验证,这些网站显示.Net的来源以及resharper的副本,如果你自己选择这样做的话。
进一步展望,实际上这些.Net对象似乎只是一个中央旧式crypto32.dll加密上下文的包装器。令我担心的是,我更深入地查看代码,我发现它似乎明确地在磁盘文件存储中查找x509certificate2和x509certificate对象上的PublicKey字段的getter和setter中的公钥和私钥。尽管事实上,我会希望它们只存在于内存中。根据这些知识,它似乎将我的私钥存储在此存储中,即使我不希望它这样做,因为构造函数不允许您更改此选项并根据我看到的构造函数列表将其关闭看看文档;因此,如果您从PrivateKey字段设置()或get(),它实际上只是从幕后的文件存储中收集它。
我认为被迫将我的私钥泄露到文件系统 - 甚至暂时 - 是一个巨大的安全问题,所以我不想这样做。我也不相信证书商店。即使你不同意我,我个人认为即使我不打算将我的私钥序列化到磁盘也是一个巨大的安全问题,所以我不想这样做。
我目前的目标是简单地能够在C#中生成RSA公共和私有X509密钥,可以在Windows上使用而无需在创建过程中强制将它们写入硬盘,而我不是找到许多有效的选项,因为我能找到的所有选项似乎都有隐藏的差距或公开的问题。
目标不是永远不要将它们写入磁盘,只是不这样做,除非它使用我编写的代码并且知道它是安全的,以确保它们在静止时完全加密;也就是说,它不应该这样做,除非我在密钥本身已经完全加密后明确要求它。
简而言之:我想使用C#在Windows上编写安全软件,以生成509证书,该证书不会强制我导出,导入或以其他方式将我的私钥泄露到文件系统,作为证书创建的一部分。我希望能够使用尽可能少的第三方代码在Windows上创建自己的X509Certificates。
我如何在不执行以下任何操作的情况下最好地创建自己的X509证书,因为我觉得它们都是安全问题:
答案 0 :(得分:1)
如果不进行超低级别(或完全禁用分页),则无法保证您的私钥材料永远不会写入磁盘,因为它总是可以被分页。即使这样,在支持休眠的系统上,您的密钥也会出现在休眠文件中。
crypt32密钥存储机制使用DPAPI(用户或计算机作用域,具体取决于您在PFX中的导入标记和/或标记)来加密静态的密钥材料。因此,虽然它涉及文件系统,但它并不“存储在磁盘上,只供任何人访问它们”;除非他们像你一样运行,或者有权访问系统密钥。
答案 1 :(得分:0)
就像其他人所说的那样,如果您对此感到担忧并且不愿意信任任何人/任何外部API,那么您将不得不使用比.Net更低级的语言。 .Net是一种很棒的RAD类型语言,但是如果你不信任你运行的机器,你将需要你能达到的最低级别的环境。
C将是一个不错的选择。