关于polipo发送加密数据的想法

跟踪了一下polipo的源码,对于polipo发送加密数据的流程有了一点自己的想法,发出来请大家指正。

建一张密钥数组key[4096](全局变量),其中每个元素存放一条tcp连接的密钥(作为一个轻量级的代理,polipo不可能在同一时刻为4096条连接服务,恶意攻击除外,因此4096的数组应该能满足密钥的存放需要),在接受或者发起连接时更新其中元素:

(1)当Polipo接受客户端或者上级代理的连接请求时,会调用do_scheduled_accept进行处理。其中代码:

rc = accept(request->fd, (struct sockaddr*)&addr, &len);

rc就是该连接的fd;addr中存放了发起对端的IP地址。可通过IP地址到social manager查询对端是否与自己协商过密钥,如果是那么将密钥存入key[fd];

(2)当Polipo作为客户端向下级代理或者正常服务器发起连接时,会调用do_connect进行处理。其中代码:

fd = serverSocket(af);(serverSocket会调用socket函数并返回值赋给fd);

通过参数addr中存放的通信对端的IP(注意此处的addr是Atom类型,需要对addr->string进行处理才能取出IP地址)。判断IP地址是否父代理,如果不是就判断对端是正常的服务器(DNS及WEB),那么就不加密传输;否则就表示对端是父代理,那么就通过IP地址到social manager查询对端是否与自己协商过密钥,如果是那么将密钥存入key[fd];

上面两种情况中的每个fd都单独对应一条连接。Polipo调用do_scheduled_stream函数发送数据时,实际上在函数真正调用其中的WRITE或者WRITEV(后者会对多个buf进行发送)发送数据之前可以插入我们自己的加密函数,通过request->fd查找到对应的密钥key[request->fd],并用之将buf(多个buf)加密,然后再调用WRITE或者WRITEV进行发送。

当连接断开时,可以考虑将对应的key[fd]清零。

对于数据解密的处理,目前还在探索中。to be continued……

此条目发表在Uncategorized分类目录。将固定链接加入收藏夹。

评论功能已关闭。