服务器和客户端之间的双向加密/身份验证

时间:2015-08-11 02:44:25

标签: authentication encryption

说实话,我不知道这是否是合适的标题,因为我是这个领域的新手,但我会尽力在下面解释。

可以将场景建模为一组功能相同的服务器和一组功能相同的客户端。假设每个客户端都知道所有服务器的端点(可能来自代理或某种名称服务),并随机选择一个与之通信。

问题1:客户端和服务器首先需要相互验证自己(即客户端必须向服务器显示它是一个有效的客户端,反之亦然)。

问题2:之后,客户端和服务器通过某种加密方式相互通信。

对于问题1,我不知道什么是最佳解决方案。对于问题2,我考虑让每个客户端创建一个私钥,并将相应的公钥提供给它在认证后立即与之通信的服务器,以便其他任何人都无法解密其消息。并让所有服务器共享一个私钥并将相应的公钥分发给所有客户端,以便外部世界(包括客户端)无法解密客户端发送给服务器的内容。

这些可能是非常天真的方法,所以我非常感谢任何帮助&对这些问题的看法。谢谢。

1 个答案:

答案 0 :(得分:0)

半年前我在这里问了一个类似的问题,我被重定向到Information Security

在阅读完我的回答并重新思考你的问题之后,如果你仍然有如此广泛的问题,我建议在那里问。据我所知,StackOverflow更多的是编程(因此编程中的安全性)而不是安全性概念。无论哪种方式,在执行项目时,您可能必须在某处进行迁移。

首先,您需要认真考虑系统中需要保护的内容。与here (check Gilles' comment and others)一样,要做的第一件也是最重要的事情之一就是考虑你必须采取的安全措施。您刚才提到了身份验证和加密,但还有许多重要的事情,例如数据完整性。检查wiki page for security measures。了解了更多相关信息后,您可以选择所需的加密算法,散列函数和其他函数。

例如,忘记数据完整性就是忘记散列,这是我在SO上遇到的最流行的安全措施。通过应用加密,您“只能”期望没有其他人能够阅读该消息。但是你不能确定它是否因为拦截器或信号丢失而未改变(如果有的话)到达目的地。我想你需要确定。

我所知道的典型架构,假设私钥交换的非对称加密,然后使用私钥进行通信。这是因为公钥基础结构(PKI)假设其中一方的密钥是公开的,这使得通信更容易,但肯定更慢(例如由于密钥长度:RSA [不对称] ]从512位开始,但典型的密钥长度现在是2048,我可以比较最弱,但仍然是安全的AES [对称],密钥长度以128位开始)。问题是,正如您所说,服务器和用户没有相互认证,因此服务器并不真正知道发送数据的人是否真的是他们声称的人。此外,数据可能在流量期间已更改。 为了防止这种情况,您需要一个所谓的“密钥交换算法”,例如 Diffie Hellman 方案之一(因此, DH 可能是两者的'原始'答案你的问题)。

考虑到上述所有因素,您可能希望使用一种(或多种)流行的协议和/或服务来定义您的体系结构。流行的是 SSH,SSL / TLS和IPSec 。阅读它们,定义您需要的服务,检查它们是否存在于上述某个服务中,并且您愿意使用该服务。如果没有,您可以使用原始加密算法和摘要(哈希)来设计自己的。