encryption - 如果服务器受到攻击,如何防止中间人攻击?

标签 encryption cryptography rsa public-key

想象一下,服务器将用户的公钥提供给他们的合作伙伴,以使加密通信成为可能。但是,服务器无权访问私钥..

无论如何 - 想象一下服务器被黑了,它不发送请求的公钥:

Alice requests Bob's public key
Server sends Eve's public key

Bob requests Alice's public key
Server sends Eve's public key

Alice sends a message to Bob
Server unpacks message, reads it and repacks it -> sends to Bob...

Bob sends a message to Alice
Server unpacks message, reads it and repacks it -> sends to Alice...



我的问题是 - 如何防止这种滥用? Alice 如何确定她正在使用 Bob 的公钥,反之亦然?

最佳答案

根据你刚才提出的方案,你不能。这里的关键(没有双关语)是,如果用于验证 key 有效性的方法被破坏,你就输了。

SSL 试图通过创建签名链来避免这种情况 - 一些(非常小心地保护并通过其他方法验证) key 签署另一个 key ,签署另一个 key ,签署 Alice 的 key 。通过验证链中的每一步,您(原则上)可以知道链是有效的——但是如果链中任何一步的私钥被泄露,您就会失败。

PGP(又名 GPG)尝试以不同但相似的方式解决问题 - key 可以由任意数量的其他 key 签名,形成一个图(称为 web of trust )。您选择一些您已确认有效的 key ,例如,亲自验证它们,并将它们标记为受信任。然后,通过少于 N 步(和/或来自来自不同可信根的 M 个不同路径)可到达的任何 key 也被认为是有效的。

如果你真的很偏执,你当然可以把 key 交给对方。当然,他们必须确定不是有人伪装成你……

也就是说,验证 key 有效性的唯一真正万无一失的方法是自己生成它……除非您的硬件/操作系统/编译器/大脑也受到了损害:)

关于encryption - 如果服务器受到攻击,如何防止中间人攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3591342/

相关文章:

c++ - 更多 Cpp、Winsock、RSA 和 OpenSSL

c# - RSA公钥解密c#(powershell)

android - 如何保护音乐文件?

java - crypto.pbkdf2 (node.js) 和 PBEKeySpec 之间 key 长度的差异

encryption - 如何处理 pkcs11 中的填充错误?

java - 为什么 Cryptoki.C_OpenSession 有时会与 HSM 断开连接

java - 如何从 AES-256 切换到 AES-128?

java - AES128算法如何生成64位加密 key ?

c# - 使用Base64编码的公钥验证RSA签名

java - OpenSSL 和 Java 产生不同的 SHA256 RSA 签名