上一篇我们已经完成了socks5客服端和服务端的第一次握手认证,相互确认了socks协议的版本号,认证的方式,现在认证方式定为用户名和密码认证,接下来我们马上就来认证。
RFC的socks5文档中并没有写用户名和密码认证的认证细节,而是写在另一篇文档中。
客户端在接收到上一篇最后发出的数据后,会发出下面这个格式的数据
+—-+——+———-+——+———-+
|VER | ULEN | UNAME | PLEN | PASSWD |
+—-+——+———-+——+———-+
| 1 | 1 | 1 to 255 | 1 | 1 to 255 |
+—-+——+———-+——+———-+
第一个参数VER
表示当前的账号密码认证的协议版本号(注意这个不是socks的版本号),暂时只有0x01
。
第二个参数带ULEN
为用户名的长度,从这里可以看到用户名最长为255位。
第三组参数ULEN
就是用户名,长度就是ULEN
。
第四个参数PLEN
为密码长度,同样最长为255位。
第五组参数PLEN
是密码,长度为PLEN
。
而我们的服务端需要在获取到账号密码后返回以下格式的数据
+—-+——–+
|VER | STATUS |
+—-+——–+
| 1 | 1 |
+—-+——–+
第一个参数VER
表示当前的账号密码认证的协议版本号(注意这个不是socks的版本号),暂时只有0x01
。
第二个参数STATUS
表示是否认证成功,其中只有STATUS
为0x00
表示成功,其他都是表示错误。
下面是对应的Node
代码实现:
1 | // 这个后续会说明 |