SOCKS的安全代理实现

原文:http://briteming.blogspot.com/2012/02/socks.html

支持多进程的SOCKS安全代理。即用了认证也用了加密。具体的实现请看下面。
工程结构:
.
|– client.c (客户端源代码)
|– server.c(服务器源代码)
|– Makefile
|– pwd_file (密码文件)
`– tags (exuberant ctags)
其中pwd_file是用于认证的,客户端服务器各有自己的。客户端的只包存自己的用户名和被MD5哈希过的密码,
以’$'为间隔。服务器端存在这多个用户的信息每一个客户占一行。目前是”smIlence”的MD5摘要。
设置浏览器代理:
客户端设置浏览器的SOCKS host 为localhost:9050
开发环境:Ubuntu 10.10
开发语言:C (编译器是gcc 4.4.5)
编译方式:参考Makefile(需要openssl library)
运行方式:
客户端: $ ./client <server ip> <server port>
服务器端: $ ./server
其中server port 是8118
流程:
overview
client向server认证过程如下:
我们的认证方式是基于user和password的。首先server端会有数据库(为了简介我们是用文件形式保存),保存用户和用户密码(当然密码不是明文用,MD5)。
client一开始想和server建立链接时,client会向server发送它是谁,server会向client发送当时自EPOCH以来的微秒数,client利用收到的数和自己的密码摘要再进行哈希,然后发给服务器,服务器也会把微秒数和密码摘要哈希然后进行比较,一样就认证通过。这样做的原因是希望防止replay attack,中间者要是sniff我们的包也对他没什么用因为客户端没有发送密码摘要,而是摘要再进行哈希的摘要,利用时间是因为时间不会像随机数重复出现。
为了达到安全传输我们借用openssl来帮我们实现SSL,其中使用ASH-AES256-SHA为我们的cipher suite。
如下所示,它使用DH算法来进行密钥交换,256-bit AES来加密,和SHA1来进行消息认证。
$ openssl ciphers ADH-AES256-SHA -v
ADH-AES256-SHA SSLv3 Kx=DH Au=None Enc=AES(256) Mac=SHA1
在已经设置好浏览器的代理下,当有用户输入站点访问,浏览器会和客户端进行SOCKS4链接,成功后客户端会
向我们服务器进行认证。认证成功后,客户端接受并转发浏览器的GET请求给我们服务器,这里是在SSL下和服务器
链接,服务器再转发给目的http server,从http服务器接受回应的过程发送过去的逆过程。
最明显的安全弱点是我们的客户端没有对我们服务器进行认证。

没有评论: