[http]http转义和加解密方法

http转义和加解密 second6020180202
1 背景 无论在客户端还是在服务端程序中,http是用的非常之多的协议。但使用http有自已的规则,本文说的是http的转义和加解密的方法之一

2 转义 2.1原因:
http参数中不能传特殊字符,因为很多特殊字符内部已使用。如:= # ?等
所以在发前前,发送的内容必须经过转义。
如: http://localhost:8000?name=XXX&sex=XXX&address=XXX.....
假如:address中有特殊字符#, 那么服务端接收到后,可能转换失败。

因此,必须先对参数进行转义。

2.2 http参数特殊字符 转义规则

有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如 空格的编码值是"%20"。
下表中列出了一些URL特殊符号及编码
:替换为%3A

十六进制值
1. + URL 中+号表示空格 %2B
2. 空格 URL中的空格可以用+号或者编码 %20
3. / 分隔目录和子目录 %2F
4. ? 分隔实际的 URL 和参数 %3F
5. % 指定特殊字符 %25
6. # 表示书签 %23
7. & URL 中指定的参数间的分隔符 %26
8. = URL 中指定参数的值 %3D
例:要传递字符串“this%is#te=st&o k?+/”作为参数t传给te.asp,则URL可以是:
te.asp?t=this%25is%23te%3Dst%26o%20k%3F%2B%2F 或者
te.asp?t=this%25is%23te%3Dst%26o+k%3F%2B%2F (空格可以用%20或+代替)


2.3 python http转义方法
python中转义的方法有两种:
1. 调用urllib中quote方法,可对单个字符串进行转义
[http]http转义和加解密方法
文章图片

2. 设用urllib中的urlendcode进行编码,urldecode进行解码,参数只能为map,编码后,会输出: key=value&key1=value1等形式
[http]http转义和加解密方法
文章图片

3 对http加解密现实 3.1 原因
3.1.1 http中的参数如果明文发送,是非常不安全的,特别是比较重要的数据

例如:一个简单检验身份证的http请求,传入姓名name和身份证号idno,如果明文
http://localhost:8000?name=haha&idno=445484198701021155

这种方法是很危险的,如果请求被人截获了,那么信息就泄露了。

所以一定要加密,不论加密方法是简单还是复杂,或自定义。

3.1.2 http服务器要对每次请求验证,通过后才会处理,不能让客户端无限调用

例如:就上面那个例子,请求检验身份证,别人直接造一个链接,写几个线程循环,拼命去请求你的服务,你想会怎么样。如果是几百个几千个线程同时请求,那么服务端的压力是非常大的。假设检验身份证需去DB请求,那个大量请求,可能造成DB瓶颈。

如果上面的例子,加多一个token字段(加密的值),请求一来,就验证信息的合法性,再加上,如果同一IP多次非法请求限制,就可以不影响到内部的逻辑。
3.2 加密方法
1 md5加密(重点讲解)
a.任意长度字符串md5加密后输出的是32位长度字符串
b.加密用来检验用,相同字符串加密后的密钥是一样的。
c.MD5和双重MD5加密,是无法反向解密的。(唯一破解方法:暴力破解)
d.为防止暴力破解,可以对加密的内容,加盐处理
e.什么是加盐处理:就是在需要加密的文本内容,和一串长且复杂的文本进行拼接,这样就能防止加密后的MD5值被暴力碰撞破解。

使用方法:
md5(客户端密码) == md5(服务端DB查出的密码)/ db存的密码就是MD5值

更安全方法:
客户端加盐密码 =客户端密码 + 复杂长文本
服务端加盐密码 =服务端DB查出的密码 + 复杂长文本
md5(客户端加盐密码) == md5(服务端加盐密码)/db存的密码就是MD5值

DB存储密码的形式有两种:
1. 原始密码(危险,如果服务端被攻击,数据就是明文的)
2. 加密后的密码(安全,即使服务端泄漏,数据是密文的,全安全许多,这里不一定是md5密,可以是其他可反向解的密,对内部人员来说,是可知道原始密码的)

md5非常常用,当然双重md5会更安全。

【[http]http转义和加解密方法】2 客户端和服务端有同一个密钥,进行加密(对称加密,重点讲解)
a. 客户端和服务端都有相同的一个密钥进行加密
eg:key=!@#^*&*eaQW$%(够复杂)

b. 客户端传过来的内容:md5(需要加密的内容+密钥)
eg:
可反解的加密
加密后的name=XXXXX
加密后的idno=YYYYY
md5(“name=XXXXX&idno=YYYYY&key=!@#^*&*eaQW$%”)生成token
http://localhost:8000?name=XXXXX&idno=YYYYY&token=token值

c. 服务端校验:md5(“name=XXXX&idno=XXXX&key=!@#^*&*eaQW$%”)是否和token相等

优点:多了个验证,验证通过才会处理,防止非法调用
如果请求被截获,name和idno也是加密的,会比较安全
缺点:密钥保存在客户端本地,被破解了就不安全了
客户端更新密钥麻烦


3 对2可进行优化, 由服务端下发密钥给客户端,密钥有过期时效(对称加密,重点讲解)
a. 对于已验证的用户
b. 服务器定时客户端一个key,如:一分钟一次
c. key在服务端有过期时间,过期无效,须重新下发
d. 按2的方法加密

优点:密钥是服务端下发的,不是固定的,
密钥有过期时间,即使被破解,可能已经过期无效
安全性会比较好
缺点:服务端要维护密钥和定时更新密钥,逻辑会复杂些。

4 字典映射加检验
a. 客户端服务端存有一份字节映射表(已加密)
b. 客户端对发送内容映射,并得出奇偶校检结果
c. 服务端对传来内容反映射,并校验
d. 成功才处理

优点:对信息加检验和密文
缺点:映射表可能被破解(可对映射表加密,或服务端加密下发)

使用场景:交互协议中

5 自定义的其他方法(简单,易破解)
a.字节偏移
b.字节加减
c.双方定好偏移规则


4常用加密算法简介 常用的加密算法,有三类:md5,对称, 非对称,这里简单介绍下
4.1md5加密(不可逆)
4.2非对称加密算法
a. 公开密钥 publickey
b. 私有密钥 privatekey
c. 公开密钥和私有密钥是一对,如果用公开密钥对数据加密,只有私有密钥才能解密
d. 如果对私有密钥进行加密,也只有公有密钥才能解密

优点:比较安全
缺点:算法强度复杂
加解密速度慢

4.3对称加密算法
a 双方使用相同钥匙
b.常用的算法有:BASE64、 DES、RC4、AES等。

--------------------------------------------------------------------------------------
后话:

本文就写到这吧,主要讲的是3中的对http安全性加密方法,用的比较多的方法。也是自已的经验积累,记录下来,以免自已遗忘。如果不明白怎么实现,可以留言,我会给出具休的实现方法。

无论是什么系统,安全是最重要的。所以设计系统或接口的时候,需多考虑下安全性,会不会有漏洞,怎么样才能更加安全,保证服务器的安全和稳定性。如果设计时不考虑这些,那么被攻击,数据泄露是很常见的。

对于服务端来说,任何外部的请求都是不可靠的,包括客户端请求,每个参数的检验,判断,能防止大部份的攻击。即安全了很多,同时也减轻了服务端的压力。

网上很多加密解密的库,直接拿来用就行了。不一定要用多重杂的加解密算法,重要的是解决问题的方案。选择最适合的方案来解决问题,才是王道。




    推荐阅读