我目前正在开发一个在客户端和服务器之间传输数据的系统,并且想知道我计划使用的加密强度是多少。
我的想法是拥有私有/公共RSA密钥对,并将公钥分发给每个客户端(仅将私钥留在服务器上)。然后,每个客户端将生成自己的AES密钥,RSA会对其进行加密。然后,他们将AES加密其数据并将加密的数据和加密的AES密钥发送到服务器。然后,服务器将使用私钥解密AES密钥,然后使用AES密钥解密数据。
我是否遗漏了任何安全漏洞和/或有更好的方法吗?
答案 0 :(得分:19)
这几乎就是SSL/TLS的工作方式(查看握手部分)。使其更强大的唯一方法是为每个连接生成AES密钥,而不是每次都使用相同的密钥。您可能还想对来回传递的消息进行数字签名,以避免中间人和其他欺骗攻击。
一般来说,创建一个好的密码系统非常困难。如果可能,您应该始终支持现有(受信任)应用程序来提供帮助。在这种情况下,您可以考虑使用HTTPS发送消息,而不是创建自己的系统。
答案 1 :(得分:2)
您应该向我们提供有关您正在使用的语言和平台的更多信息,以便我们为您提供有关已存在的库的具体建议,并将为您处理详细信息。直接使用加密原语并非易事,也很难完全正确,而且使用加密技术,只有一次“不完全正确”才能破坏安全性。
要回答您的问题,通常最好通过Diffie-Hellman交换创建会话密钥(AES密钥),并且每一方都使用其私有RSA密钥来签署其密钥交换数据。
否则,如果未通过DH交换建立会话密钥,则获得对私有RSA密钥(必须存储在某处)的访问者可以解密在客户端和服务器之间发送的所有流量。 / p>
如果通过DH交换建立了秘密 ,那么只会暴露协议的认证部分。虽然拥有私有RSA密钥的对手将无法读取任何先前的通信,但他仍然可以进入与客户端/服务器的经过身份验证的对话或发起中间人攻击(可能或可能不容易做到,取决于网络。)
答案 2 :(得分:0)
如果攻击者将其公钥替换为“真正的”公钥,则会出现一个漏洞。然后他们就可以拦截交通,成为“中间人”。
S / MIME,PGP和TLS等协议使用RSA加密来按照您的建议传输密钥。但是,他们使用的公钥是由受信任的机构签署的证书。
必须谨慎保护这些受信任机构的完整性。例如,它们可能被刻录成防篡改硬件令牌,或者可能使用密码计算MAC。
答案 3 :(得分:-3)
我不确定你的方法会保护什么!您将在服务器上保留私钥,并且将分发公钥。如果我获得了您的公钥,我将能够随意与您的服务器进行交互。我认为你应该扭转关键所有权;每个客户端将拥有自己的私钥,服务器将有一个公钥列表(ala SSH)。服务器必须添加“授权”公钥,并且只有私钥的持有者才能连接。
希望这有帮助。