为了学习,我创建了一个聊天应用程序,其中连接通过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是安全的?
发布于 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),这应该是很好的。
https://security.stackexchange.com/questions/104810
复制相似问题