basis词性转化(basic coder » HTTP代理原理及Base64编码)
HTTP代理原理及Base64编码
有网友留言希望我在飞信的新版本中加上代理功能 ,这两天折腾了一下 ,把HTTP代理给加上了 ,SOCKS代理太麻烦了 ,暂时应该不会考虑加它了 ,而且用的人也不多 ,加不加意义不大了 。
写一下HTTP代理的原理 ,其实原理很简单 ,就是通过HTTP协议与代理服务器建立连接 ,协议信令中包含要连接到的远程主机的IP和端口号 ,如果有需要身份验证的话还需要加上授权信息 ,服务器收到信令后首先进行身份验证 ,通过后便与远程主机建立连接,连接成功之后会返回给客户端200 ,表示验证通过 ,就这么简单,下面是具体的信令格式:
CONNECT 59.64.128.198:21 HTTP/1.1
Host: 59.64.128.198:21
Proxy-Authorization: Basic bGV2I1TU5OTIz
User-Agent: OpenFetion
其中Proxy-Authorization是身份验证信息 ,Basic后面的字符串是用户名和密码组合后进行base64编码的结果 ,也就是对username:password进行base64编码 。
其实编码对安全性没什么意义 ,base64严格意义上都已经不能算是加密了 ,现在信息安全这么受重视的年代 ,不需要密钥的加密算法还是叫编码更贴切一些 ,抓到这种包之后瞬间就可以得到用户名和密码 。
HTTP/1.0 200 Connection established
OK ,客户端收到收面的信令后表示成功建立连接 ,接下来要发送给远程主机的数据就可以发送给代理服务器了 ,代理服务器建立连接后会在根据IP地址和端口号对应的连接放入缓存 ,收到信令后再根据IP地址和端口号从缓存中找到对应的连接 ,将数据通过该连接转发出去 。
下面说一下base64这种编码方式 ,它还是很常用的,优点是使用起来简单 ,缺点是编码效率低劲(每3个字节会编码成4个字节) ,安全性差(这个刚才已经说过了) 。
以前用.NET和java的时候形形色色的编码加密散列都见过也差不多都用过,不过高级语言会提供相应的类 ,一两句话就可以实现加密解密 ,当然在C里面也可以用OpenSSL来实现 ,同样简单 ,飞信里面也用到了base64编码 ,就是在2010版本里面要求输入图片验证码的时候用到的 ,服务器端会将生成的图片验证码图片的二进制数据流进行base64编码 ,以明文的方式放到xml中发送给客户端 ,客户端对其进行解码 ,然后就可以得到验证码图片(还是觉得这个过程有点多此一举) 。
今天看了一下base64的编码规则 ,把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24) ,之后在6位的前面补两个0 ,形成8位一个字节的形式,这样就形成了4个8位的字节 ,然后再将每个8位字节转换成10进制 ,再从编码表中找到对应的字符就可以了,编码的时候3个字节一组进行编码 ,当不足3个字节的时候 ,进行完上面的操作后 ,将剩余的位用0补齐(注意:并不是补到32位) ,于是2个字节编成3个字节 ,不足四个字节的用’=补齐 ,哈 ,感觉自己写得乱七八糟的 ,不过这种东西在网上一搜一大片 ,也没有必要细说了 ,另外附上刚才写的一个编码的小程序 。
上面的程序会输出bGV2aW4= ,因为最后一组不足3字节 ,用=补了一个字节 。
程序很简单,写它纯粹是为了强化一下对base64编码规则的记忆 ,解码的就不写了 。
我程序里面是直接用OpenSSL来干的 ,少量数据进行编码的时候一个函数就够了,很方便:
原创文章 ,转载请注明: 转载自basic coder
本文链接地址: http://basiccoder.com/http-proxy-and-base64-encode.html
CONNECT 59.64.128.198:21 HTTP/1.1
Host: 59.64.128.198:21
Proxy-Authorization: Basic bGV2I1TU5OTIz
User-Agent: OpenFetion
HTTP/1.0 200 Connection established
原创文章 ,转载请注明: 转载自basic coder
本文链接地址: http://basiccoder.com/http-proxy-and-base64-encode.html
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!