2

好的,为了好玩,我正在用 Java 编写一个信使程序。好玩吧?:)

我想创建一个在两台 PC 之间工作的信使,无需咨询其他任何人,您只需输入您希望与之聊天的 IP。稍后我将实施一个用户名系统,您可以在其中联系服务器以找出他们的 IP。

我让 AES 和 RSA 完美地工作,然后我意识到当你进行公钥私钥交换时,中间人攻击是可能的。这有点让我生气...

除了使用 CA 或让服务器交换用户名和/或公钥信息之外,是否有任何解决中间人攻击的方法?

有没有这样的程序我可以看看?

多谢你们!

请注意:目标是在没有服务器的情况下进行安全的点对点通信。也没有像中间人这样的漏洞。

4

3 回答 3

2

您必须选择:CA 或共享密钥。没有其他办法。因为否则你怎么能认证对方呢?当然,您可以将其包装在 ssl、pgp、密码、OTR 协议或许多其他协议中,但这只是一个抽象层。如果您当然不想要 CA,那么您必须选择 common secret。正如@Shark 所说,OTR 显示了一个很好的方向 - 你提出问题,对方的回应,如果你的回应是正确的,另一方就被认证了

于 2012-07-27T19:31:09.657 回答
2

基本上你要求太多了。如果您正确使用它们,公钥是安全的。如果您进行听起来不安全的“公钥交换”。私钥永远不会离开生成它们的主机。

公钥是公开的,只是字节。是一对数字!!没有其他信息。所以这里需要选择:

  1. 让受信任的第三方拥有将公钥与身份相关联的共享服务器。这就是所谓的 CA :)
  2. 以其他安全方式交换公钥。示例:在一个人的 Facebook 个人资料上发帖(使用 HTTPS 浏览它!),与其他人会面等。

您可能想了解 PGP 和 Web Of Trust 的工作原理。使用 WOT,您可以以社交网络方式进行非常安全的 P2P 聊天。基本上,您仍然永远无法通过键入 IP 地址第一次加入 P2P 聊天,但在您进行初步工作后,您可以获得良好的结果。

首先,获取某人的公钥:遇见他/她。届时,您可以验证该方,他可以验证您,而不会受到攻击。

第二阶段包括建立信任链。我将用社交网络术语解释这一点。你是甲方,你遇到了乙方。你们彼此认识。B认识C、D、E,然后你遇到了B不认识的F。

问 B 谁是他的朋友(并得到他们的公钥),你会了解 C、D 和 E,然后你就可以联系他们了。告诉 B 你知道 F,他可以联系他们。

你可能想告诉 F 你通过 A 知道的 C、D 和 E。这是非常敏感的,因为如果这个过程不分青红皂白地重复,坏人很容易进入网络。如果您将信任限制在“朋友的朋友”或达到一定程度的间接知识,您可以平衡安全性。

我以这种方式向您提出建议,因为您告诉您这样做是为了好玩,而不是在商业场景中!

于 2012-07-27T19:48:38.860 回答
1

你需要OTR。http://www.cypherpunks.ca/otr/

一旦它稳定了,我会帮你测试它。一段时间以来一直有同样的想法。

于 2012-07-27T17:38:05.220 回答