正确生成RSA + AES密钥

问题描述:

为了学习目的,我创建了一个聊天应用程序,通过SSL/TLS完成连接,并且使用AES-CBC-256对消息进行加密,并且使用RSA- 2048。正确生成RSA + AES密钥

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

我还应该声明我正在使用HMAC-SHA512来散列消息并发送使用与AES密钥/ Iv加密相同的公钥加密的HMAC密钥。由于我读过它不需要经常重新生成,我打算每5000或10000次呼叫重新生成HMAC密钥。

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

+0

这可能更好地通过https://security.stackexchange.com询问。 – oleksii

+0

@oleksii谢谢,https://security.stackexchange.com/questions/104810/properly-generating-rsaaes-keys –

+2

此外,您可以使用Diffie-Hellman密钥交换生成临时会话密钥,以实现完美的前向保密。 –

没有太多答案,因为你在做什么是最好的做法。

虽然有些说明;

每个会话的RSA密钥对不是必需的(并且生成密钥会消耗)。

在应用程序的整个生命周期中或多年以来,您只能拥有一个2048位强的RSA密钥,因为即使是电子商务网站或金融应用程序等对安全性要求最高的Web应用程序,也是如此。

对于每个会话你应该有一个随机的AES密钥/ IV对,这很好。

由于您正在安全地发送密钥(RSA加密),并且您还在线路上安全地发送了HMAC值(AES加密),所以每个会话最好有一个HMAC密钥(不是进程范围)。

仅更改IV几乎等于更改密钥和IV(某种意义上),因为如果更改IV,加密输出对于相同内容将会不同。

但是请注意。为了防止模仿您的服务器证书的中间人攻击,您的客户端代码是通过签名检查来验证证书,还是仅仅是您在客户端未经任何验证发送的公钥?

您应该有一个自签名持久性证书或生成由持久性证书(例如,CN = FrozenDeathChatServer)颁发的随机证书(RSA密钥对),其中客户端软件安装期间的客户端安装在可信根证书颁发机构。

+0

谢谢。我将改变我的模型来获得一个静态RSA密钥对,而不是一个随机的HMAC密钥。我还将研究如何实施ECDiffieHellmanCng。据我所知,中间人攻击不能发生在我使用的客户端 - 服务器模型中,因为我使用WSS(基于HTTPS的WebSocket) –