当前位置:   article > 正文

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

http转义

http转义和加解密

second60  20180202

1 背景

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

     

2 转义

2.1原因:

http参数中不能传特殊字符,因为很多特殊字符内部已使用。如:= # ?

  所以在发前前,发送的内容必须经过转义。

  如: http://localhost:8000?name=XXX&sex=XXX&address=XXX.....

  假如:address中有特殊字符#, 那么服务端接收到后,可能转换失败。

 

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

 

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


有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII16进制)码值。例如 空格的编码值是"%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. 调用urllibquote方法,可对单个字符串进行转义

 

2. 设用urllib中的urlendcode进行编码,urldecode进行解码,参数只能为map,编码后,会输出: key=value&key1=value1等形式

  

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会更安全。

 

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相等

 

优点:多了个验证,验证通过才会处理,防止非法调用

      如果请求被截获,nameidno也是加密的,会比较安全

缺点:密钥保存在客户端本地,被破解了就不安全了

    客户端更新密钥麻烦

 

 

3 2可进行优化, 由服务端下发密钥给客户端,密钥有过期时效(对称加密,重点讲解)

a. 对于已验证的用户

b. 服务器定时客户端一个key, :一分钟一次

c. key在服务端有过期时间,过期无效,须重新下发

d. 2的方法加密

 

优点:密钥是服务端下发的,不是固定的,

      密钥有过期时间,即使被破解,可能已经过期无效

          安全性会比较好

    缺点:服务端要维护密钥和定时更新密钥,逻辑会复杂些。

 

4 字典映射加检验

a. 客户端服务端存有一份字节映射表(已加密)

b. 客户端对发送内容映射,并得出奇偶校检结果

c. 服务端对传来内容反映射,并校验

d. 成功才处理

 

优点:对信息加检验和密文

缺点:映射表可能被破解(可对映射表加密,或服务端加密下发)

 

    使用场景:交互协议中

 

5 自定义的其他方法(简单,易破解)

a.  字节偏移

b.  字节加减

c.  双方定好偏移规则

 

 

4常用加密算法简介

常用的加密算法,有三类:md5, 对称, 非对称,这里简单介绍下

4.1  md5加密(不可逆)

4.2  非对称加密算法

a. 公开密钥 publickey

b. 私有密钥 privatekey

c. 公开密钥和私有密钥是一对,如果用公开密钥对数据加密,只有私有密钥才能解密

d. 如果对私有密钥进行加密,也只有公有密钥才能解密

 

优点:比较安全

缺点:算法强度复杂

      加解密速度慢

 

4.3  对称加密算法

a 双方使用相同钥匙

b. 常用的算法有:BASE64 DESRC4AES等。

 

--------------------------------------------------------------------------------------

后话:

 

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

 

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

 

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

 

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

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/616251
推荐阅读
相关标签
  

闽ICP备14008679号