Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在服务器端生成私钥(证书)是个坏主意吗?_C#_Windows_Security_Transfer_Private Key - Fatal编程技术网

C# 在服务器端生成私钥(证书)是个坏主意吗?

C# 在服务器端生成私钥(证书)是个坏主意吗?,c#,windows,security,transfer,private-key,C#,Windows,Security,Transfer,Private Key,我正在处理一些加密项目(使用C#),有一个任务,我正在考虑如何做好 我需要客户端为非对称加密生成私钥,但正如我已经回顾了一些库一样,这并不是一项干净简单的任务 为什么? 对于在Windows中生成私钥,我有以下几种可能性: 使用makecert.exe,pvk2pfx.exe等生成它们。。。但是这些工具 来自Windows SDK,似乎与其他DLL链接, 因此,如果客户端有一个干净的操作系统(没有安装任何库),我可以: 1). 在客户端的PC上安装Windows SDK(2)。复制makece

我正在处理一些加密项目(使用C#),有一个任务,我正在考虑如何做好

我需要客户端为非对称加密生成私钥,但正如我已经回顾了一些库一样,这并不是一项干净简单的任务

为什么?

对于在Windows中生成私钥,我有以下几种可能性:

  • 使用
    makecert.exe
    pvk2pfx.exe
    等生成它们。。。但是这些工具 来自Windows SDK,似乎与其他DLL链接, 因此,如果客户端有一个干净的操作系统(没有安装任何库),我可以: 1). 在客户端的PC上安装Windows SDK(2)。复制
    makecert.exe
    和其他实用程序和 在项目发行版中保留它(我认为,这是一个坏主意,因为Windows版本不同(从7到10)和32/64位体系结构

  • 使用Bouncy Castle生成代码,方法不错(我也可以使用编程语言而不是外部工具,这对我来说是一个优势),但是C版本没有很好的文档记录,源代码中有一些丑陋的地方

  • 使用
    OpenSSL
    ,我不喜欢它,因为有几个函数调用 库本身有错误(多线程)

  • 使用
    PowerShell
    (也是一个选项,但我想会有 在旧版本的Windows(如7)上支持它时出现问题

基于这些事实,我想,如果我让客户端不再生成私钥呢?这是一个坏主意吗?我可以在服务器端生成私钥,不保存它,只通过TLS传输


哪些安全漏洞存在于这种方式中?考虑,TLS的使用是<强>严格< /强>选项。

< P>这取决于您的应用程序。在服务器上生成私钥存在至少两个问题。

  • 客户端必须相信您没有保存此密钥以备将来使用。您知道您没有保存此密钥,但客户端不知道。根据应用程序的不同,这可能是一个重要的区别

  • <> LI>

    即使在某些情况下,也可以通过中间人截获密钥,例如,公司可能会在组织中的每个计算机上安装可信根证书,然后拦截和解密在该组织中出现的所有SSL流量。应用程序的类型

    假设您编写的聊天应用程序面向大量用户,并希望加密用户之间的所有消息。然后,如果您将在服务器上生成密钥,则没有人会(或至少应该)使用您的应用程序。首先,您可以将其所有密钥转储到政府\任何人(他们不能100%确定这不会发生),即使您不这样做,也有一些国家通过使用“假”可信根证书来检查ssl流量


    长话短说,如果您可以在客户端生成私钥,那么就这样做。在您的情况下,我认为您可以。

    取决于多种考虑因素

    • 您的用户期望什么?旨在提供“零知识”的设计诸如这样的解决方案可以保证,即使是拥有服务器完全管理员权限的人也无法解密您的数据。在这种情况下,在服务器上生成密钥并承诺不存储密钥并不能阻止它:任何拥有服务器完全管理员权限的人都可能随时违背这一承诺。因此,要实现真正的零知识,您必须在客户端生成密钥
    • 您是否愿意接受性能影响?它是否打开DoS向量?也许因为我是一个安全人员,我绝对不会在服务器上这样做

    如果我是你,我会在客户端进行BouncyCastle。

    为什么不使用.NET(RSACryptServiceProvider)生成?@Evk如果它是.NET并且仅适用于Windows,那么我的答案是肯定的。但是如果客户端是基于Android的iOS设备呢?同样,Q是关于不同的东西。关于使用所有描述的选项进行这样的传输(不在后端保存&严格通过TLS)安全吗?取决于您在那里使用的是什么。如果您使用mono(xamarin)-那里应该有相同的RSACryptoServiceProvider。毫无疑问,Android和iOS都有自己的库来处理这类东西。但这实际上是一个单独的问题。(如果您只是想问在服务器端生成证书是否合适,而不是如何在客户端生成证书,那么可能应该在信息安全堆栈交换上,而不是在这里。)@downvoter hater,您好!回答很好,谢谢!我想,TLS是在防御MiT攻击,早些时候…:(但是,当客户端也需要发送证书时,可能有一个使用TLS相互身份验证的选项,哪个服务器端可以检查。但是,您已经在客户端上拥有私钥(证书中的私钥),您不需要生成它:)如果您的客户端上已经有私钥,那么我认为您可以安全地向他提供更多。首先,可能有多个用于不同目的的证书。例如,预初始化状态。好的,谢谢,我认为我应该做一些研究。请注意:例如,您不能将客户端证书嵌入到应用程序中并使用一个证书,然后任何人都可以下载您的应用程序并将其解压缩。客户端证书应该在客户端上生成,您将回到您的问题。