我有一个客户端 - 服务器结构,为了避免发送公钥我正在考虑使用固定密钥。那怎么样?
我正在填充并在加密时使用随机SHA-256。因此,在公众修复后,攻击者无法使用蛮力来解密。
我有一个客户端(Xamarin APP)和一个Web Api服务器。我已经在使用SSL了,我知道这就够了!但想象一下,我不能使用SSL,我必须使用异步加密。我必须:CLIENT- request publickey - > SERVER - 生成公钥和私钥 - >客户端 - 获取publickey和cripto,发送cripto数据 - > SERVER - 获取cripto数据并解密。
答案 0 :(得分:1)
这取决于您是否同时控制客户端和服务器,如何存储/修复密钥,以及将替换部署到客户端/服务器代码的难度。如果您进行重新部署并不困难,并且您知道客户端的所有实例都会立即更新,我想如果您需要旋转密钥,我可以重新部署。
但是,如果重新部署并不容易,并且/或者您无法保证所有代码都会立即更新,则可能会出现问题,因为您可能无法轮换如果您当前的一个受到损害,那就是关键。
另一个问题是,您并不希望所有客户端都使用相同的私钥,特别是如果您拥有大量客户端。这会增加您的私钥最终被泄露的风险,并使服务器更难以验证各个客户端的真实性。此外,这会产生单点故障,因为如果私钥被泄露,则会损害所有客户端的通信。如果每个客户端都有自己的私钥/公钥,如果其私钥被泄露,则对其他客户端没有影响,因此损害将更加严重。
使用每个客户端密钥,泄露私钥只会损害自上次密钥轮换以来发生的单个客户端的通信;例如,如果您每隔3个月轮换一次密钥,那么密钥就永远不会损害单个客户端超过3个月的通信时间。 (平均而言,它会影响该特定客户的1.5个月的沟通。)
顺便说一句,也许我误解了你的问题,但公钥加密并不重要,公钥仍然保密,只是你有办法保护私钥。为了安全地存储私钥,.NET Framework确实有key containers。
答案 1 :(得分:1)
如果您可以保护客户端的完整性,那么使用固定的公钥比使用虚拟引导安全连接更安全。
在问题和评论中阅读很多内容,听起来你想要阻止一个中间人解密从客户端到服务器的消息。为了做到这一点,客户端必须确保使用服务器的公钥,而不会被欺骗使用由中间人生成的公钥。
如果客户端中嵌入了公钥,并且您有一些机制来确保密钥是可信的,那么您就是安全的。
在基于PKI的应用程序中,这是通过使用由知名CA颁发的证书并在使用前验证它们来完成的。在自制程序中,您可以计算客户端应用程序的哈希值,将其安全地传输到客户端(在通过HTTPS提供的下载页面上,通过电话或由可信方写入等),并验证下载的应用程序的hash在运行之前匹配真实的哈希值。
答案 2 :(得分:0)
在客户端应用中嵌入公钥应该很好并且安全。
这假定公钥/私钥对是在创建应用程序时创建的,公钥嵌入在应用程序中,私钥保留在服务器上。