zoukankan      html  css  js  c++  java
  • basic coder » HTTP代理原理及Base64编码

    basic coder » HTTP代理原理及Base64编码

    HTTP代理原理及Base64编码

    2010年4月14日
    levin 发表评论
    阅读评论
    5,790 人阅读过  

    有网友留言希望我在飞信的新版本中加上代理功能,这两天折腾了一下,把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个字节,不足四个字节的用’='补齐,哈,感觉自己写得乱七八糟的,不过这种东西在网上一搜一大片,也没有必要细说了,另外附上刚才写的一个编码的小程序。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    
     #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    char* base64_encode(const char *src);
     
    int main(int argc , char *argv[])
    {
    	const char in[] = "levin";
    	char *res = base64_encode(in);
    	printf("%s\n" , res);
    	free(res);
    	return 0;
    }
    char* base64_encode(const char *src){
     
    	char* dest;
    	char in[4];
    	long buf = 0 , tmp = 0;
    	int i = 0 , j = 0 , count = 0;
    	char table[] = {
    	    'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G'
    	  , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N'
    	  , 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U'
    	  , 'V' , 'W' , 'X' , 'Y' , 'Z' , 'a' , 'b'
    	  , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i'
    	  , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'p'
    	  , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w'
    	  , 'x' , 'y' , 'z' , '0' , '1' , '2' , '3'
    	  , '4' , '5' , '6' , '7' , '8' , '9' , '+'
    	  , '/' , '='
    	};
     
    	count = strlen(src) / 3 + (strlen(src) % 3 == 0 ? 0 : 1);
    	dest = (char*)malloc(count * 4 + 1);
     
    	for( ; j < count ; j++){
     
    		bzero(in , sizeof(in));
    		strncpy(in , src + j * 3 , 3 );
     
    		buf = 0 , buf = 0 , i = 0;
     
    		for(; i < strlen(in) ; i++){
    			tmp = (long)in[i];
    			tmp <<= (16 - i * 8);
    			buf |= tmp;
    		}
     
    		for(i = 0; i < 4 ; i ++){
    			if(strlen(in) + 1 > i){
    				tmp = buf >> (18 - i * 6);
    				tmp &= 0x3F;
    				dest[j * 4 + i] = table[tmp];
    			}else{
    				dest[j * 4 + i] = '=';
    			}
    		}
    	}
    	return dest;
    }

    上面的程序会输出bGV2aW4=,因为最后一组不足3字节,用=补了一个字节。

    程序很简单,写它纯粹是为了强化一下对base64编码规则的记忆,解码的就不写了。

    我程序里面是直接用OpenSSL来干的,少量数据进行编码的时候一个函数就够了,很方便:

    1
    
    EVP_EncodeBlock(out , (unsigned char*)in , strlen(in));

    原创文章,转载请注明: 转载自basic coder

    本文链接地址: http://basiccoder.com/http-proxy-and-base64-encode.html

  • 相关阅读:
    Struts2之Domain Model(域模型)。
    struts2接收参数的5种方法
    java泛型中特殊符号的含义
    @value取值
    Spring分页实现PageImpl<T>类
    eclipse快捷键整理
    String字符串的截取
    Java调用ASP.NET的webservice故障排除
    根据wsdl文件用soapUi快速创建webService服务(有图有真相)
    @Autowired标签与 @Resource标签 的区别
  • 原文地址:https://www.cnblogs.com/lexus/p/2596863.html
Copyright © 2011-2022 走看看