首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确生成RSA+AES密钥

正确生成RSA+AES密钥
EN

Security用户
提问于 2015-11-06 15:51:19
回答 1查看 1.4K关注 0票数 3

为了学习,我创建了一个聊天应用程序,其中连接通过SSL/TLS完成,消息使用AES-CBC-256加密,AES密钥使用RSA-2048加密。

每个会话每个用户都随机生成AES密钥(AesProvider.GenerateKey()) (这意味着每个用户与其聊天时都有一个密钥),而IV是通过传入生成的密钥随机生成的(AesProvider.GenerateIV()),每次创建消息时(在发送之前)。在RSA方面,我正在生成一个安全的随机会话名来存储容器中生成的私钥,并发送公钥。我还使用了与AES中相同的模型(每个用户使用一个密钥对)。

我还应该声明,我使用HMAC - the 512散列消息,并发送使用AES密钥/Iv加密的相同公钥加密的HMAC密钥。因为我已经读到它不需要经常重新生成,所以我计划每5000或10000次调用一次HMAC密钥。

问题: 1)我应该只为每个用户创建一个RSA密钥对,并在所有会话中使用它,还是说它现在是好的? 2)是否使用相同的AES密钥,并且只像上面解释的那样更改IV是安全的?

EN

回答 1

Security用户

回答已采纳

发布于 2015-11-06 16:43:36

显然,您使用RSA进行密钥交换:甲方希望与乙方共享一个秘密(例如,某个AES或HMAC提供的密钥);因此,甲方生成一个随机值K,并使用B的公钥对K进行加密。B将使用其私有RSA密钥执行解密和恢复K。

只有甲方使用真正属于预定收件人的RSA公钥进行加密,此过程才能工作(B)。A可能记得B以前的交互中的公钥,或者可能有一个中心信任的存储库,可能是一个“虚拟化”存储库(这就是证书的意义)。在任何情况下,必须有一些东西来防止攻击者推开他们自己的、假的RSA公钥而不是真正的公钥。这不是一个容易解决的问题。如果您在每次会话的基础上生成新的密钥对,那么这个问题将变得更加困难。

无论如何,当您使用SSL (这是一个好主意)时,您已经得到了用于所有客户端到服务器通信的那种机制。SSL客户端使用SSL服务器的公钥(在服务器的证书中)与该服务器建立共享秘密。您没有看到这些,因为所有这些都隐藏在SSL库中;但是它就在那里。如果您需要一些额外的加密,那么我必须假设您需要从用户到用户的加密,因为中央服务器是不可信的。(如果您只想在每个客户端和服务器之间进行一些加密,那么对于SSL来说,这将是完全多余的。)

对于用户对用户的加密,每个用户A必须以某种方式知道A想要与之交谈的每个其他用户B的公钥。这类公钥的分发是核心问题,因为您想阻止假密钥,但您不信任中央服务器来维护顺序(如果您信任中央服务器,那么您只需让SSL完成工作)。您可能希望研究分散公钥分发的可能模型中的信任网的概念。

对于对称加密,生成新IV的全部要点确实是能够安全地重用对称加密密钥。只要您正确地生成这样的IV (CBC需要随机的、统一的、不可预测的IV),这应该是很好的。

票数 2
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/104810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档