我正在处理一些加密项目(使用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的使用是STRICT选项。
这取决于您的应用程序。在服务器上生成私钥至少有几个问题。
-
客户端必须相信您没有保存此密钥以备将来使用。你知道你不知道,但客户不知道。根据应用程序的不同,这可能是一个重要的区别。
-
即使您通过TLS发送密钥,在某些情况下,它仍然可以被中间的人拦截。例如,公司可能会在组织中的每台计算机上安装受信任的根证书,然后拦截并解密所有进出该组织的ssl流量。同样,根据应用程序的类型,这可能很重要,也可能不重要。
假设您编写了针对大量受众的聊天应用程序,并希望加密用户之间的所有消息。然后,若您将在服务器上生成密钥,并没有人会(或者至少应该)使用您的应用程序。首先,你可以将他们所有的密钥转储给政府(他们不能100%确定这不会发生),即使你不这么做——在整个国家,ssl流量都是通过使用"假"可信根证书进行检查的。
长话短说——若你们能在客户端生成私钥——那个么就这么做吧。就你而言,我认为你可以。
取决于多种因素!
- 您的用户期望什么?旨在提供";零知识";SpiderOak等解决方案可以保证,即使是拥有服务器完全管理员权限的人也无法解密您的数据。在这种情况下,在服务器上生成密钥并承诺不存储密钥并不能解决问题:任何对服务器具有完全管理员访问权限的人都可能随时违背这一承诺。因此,要实现真正的零知识,您必须在客户端生成密钥
- 你愿意接受绩效影响吗?它是否打开DoS矢量?也许因为我是一个安全人员,我绝对不会在服务器上做这件事
如果我是你,我会在客户一边追求BouncyCastle。