- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想用 Java 编写一个非常简单的洋葱路由器实现(但包括 chaum 混合)——许多公钥/私钥加密看起来很简单,但很难理解最后一个路由器如何知道最终的洋葱皮已经被“剥”了。
我正在考虑对某种校验和进行编码,以便每个路由器尝试使用其私钥进行解密,如果校验和有效 - 将新剥皮的洋葱转发到下一个路由器。
只有这样,(假设每次成功解密时都会删除一些校验和)才会有一种方法(查看校验和)来估计它与解密的接近程度——这是一个主要漏洞?校验和方法是适当的简化吗?
最佳答案
无论您提到什么问题,在加密/解密数据时都包含一些完整性检查通常是一种很好的做法。但是,校验和并不真正适用于此。查看 Secure Hash 算法,例如 SHA-256(标准 Java 加密框架中内置了实现)。
现在,回到您最初的问题...对于洋葱的每个节点,您将传递一个加密的“数据包”,但该数据包不仅包含要传递的实际数据——它'将包括下一个节点的详细信息、您的哈希码以及其他任何内容......包括表明下一个“节点”是洋葱路由器还是实际终端主机的任何标志/指示。事实上,最后一个节点的数据必须包含一些特殊信息,即要与之通信的实际终端主机的详细信息。换句话说,最后一个节点知道洋葱已被剥皮,因为您将这一事实编码在它最终接收的数据中。
或者至少,我认为我会这样做......;-)
注意我认为加密本身并没有那么复杂,但可能需要注意一两个细微之处。例如,在正常的单个客户端-服务器对话中,您必须注意的一个微妙之处是永远不要使用相同的 key 对同一数据 block 加密两次(或者至少,这就是它归结为——研究“ block ”模式”和“初始化 vector ”,如果你不熟悉这个概念)。在单个客户端-服务器对话中,客户端和服务器可以指示部分初始化 vector 。在洋葱路由器中,必须找到其他一些解决方案(我想最坏的情况是,使用由客户端单独生成的强随机数)。
关于java - 洋葱路由器的一个非常简单的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2097894/
我无法理解六边形(端口适配器)架构中依赖的含义。 Here他们有漂亮的照片。我没有看到的是与 n 层结构有什么区别(实现)。 在 onion/hex 架构中,inner 层应该独立于outer 层,但
我是一名优秀的程序员,十分优秀!