HTTP如何保证安全传输

目前大多数网站和app的接口都是采用http协议,但是http协议很容易就可以通过抓包工具监听到内容,甚至篡改内容,为了保证数据不被别人看到和修改,可以通过以下几个方面避免:

  • 重要数据加密 比如用户名和密码,我们需要加密,这样即使被抓包监听,他们也不知道原始数据是什么。简单的md5是可以暴力破解的,所以加密方式越复杂就越安全,可以根据需要自由组合 常见的是 md5(不可逆),aes(可逆)
  • 非重要数据要签名 签名的目的是防止篡改,比如http://www.xxx.com/getnews?id=1,获取 id=1的内容,如果不签名通过 id=2,就可以获取 id=2的内容。怎样签名呢?通常使用sign,比如原链接请求的时候加一个sign参数,sign=md5(id=1),服务器接受到请求,验证sign是否等于md5(id=1),如果等于说明正常请求。这会有个弊端,假如规则被发现,那么就会被伪造,所以适当复杂一些,还是能够提高安全性的。
  • 登录态怎么做 http是无状态的,也就是服务器没法自己判断两个请求是否有联系,那么登录之后,以后的接口怎么判断是否登录呢?简单的做法在数据库中存一个token(名字随意),当用户调用登录接口成功的时候就将该字段设一个值,(比如aes(过期时间)),同时返回给前端,以后每次前端请求带上该值,服务器首先校验是否过期,其次校验是否正确,不通过就不让登录

补充md5加密案例

import hashlib
m = hashlib.md5()
#这是需要加密的用户名
username = 'jibu'
m.update(username.encode('utf8'))
#输出哈希值
print(m.hexdigest())
#输出长度
print(len(m.hexdigest()))

应用

用于密码管理
当我们需要保存某些密码信息以用于身份确认时,如果直接将密码信息以明码方式保存在数据库中,不使用任何保密措施,系统管理员就很容易能得到原来的密码信息,这些信息一旦泄露, 密码也很容易被破译。为了增加安全性,有必要对数据库中需要保密的信息进行加密,这样,即使有人得到了整个数据库,如果没有解密算法,也不能得到原来的密码信息。MD5算法可以很好地解决这个问题,因为它可以将任意长度的输入串经过计算得到固定长度的输出,而且只有在明文相同的情况下,才能等到相同的密文,并且这个算法是不可逆的,即便得到了加密以后的密文,也不可能通过解密算法反算出明文。这样就可以把用户的密码以MD5值(或类似的其它算法)的方式保存起来,用户注册的时候,系统是把用户输入的密码计算成 MD5 值,然后再去和系统中保存的 MD5 值进行比较,如果密文相同,就可以认定密码是正确的,否则密码错误。通过这样的步骤,系统在并不知道用户密码明码的情况下就可以确定用户登录系统的合法性。这样不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度

电子签名
MD5 算法还可以作为一种电子签名的方法来使用,使用 MD5算法就可以为任何文件(不管其大小、格式、数量)产生一个独一无二的“数字指纹”,借助这个“数字指纹”,通过检查文件前后 MD5 值是否发生了改变,就可以知道源文件是否被改动。我们在下载软件的时候经常会发现,软件的下载页面上除了会提供软件的下载地址以外,还会给出一串长长的字符串。这串字符串其实就是该软件的MD5 值,它的作用就在于下载该软件后,对下载得到的文件用专门的软件(如 Windows MD5 check 等)做一次 MD5 校验,以确保我们获得的文件与该站点提供的文件为同一文件。利用 MD5 算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面

垃圾邮件筛选

  1. 建立一个邮件 MD5 值资料库,分别储存邮件的 MD5 值、允许出现的次数(假定为 3)和出现次数(初值为零)。
  2. 对每一封收到的邮件,将它的正文部分进行MD5 计算,得到 MD5 值,将这个值在资料库中进行搜索。
  3. 如未发现相同的 MD5 值,说明此邮件是第一次收到,将此 MD5 值存入资料库,并将出现次数置为1,转到第五步。
  4. 如发现相同的 MD5 值,说明收到过同样内容的邮件,将出现次数加 1,并与允许出现次数相比较,如小于允许出现次数,就转到第五步。否则中止接收该邮件。结束。
  5. 接收该邮件

需要注意的是:MD5算法不是加密算法,是哈希算法,在MD5中没有密钥和密文的概念,所以也就没有解密一说。一个不恰当的比喻是MD5可以看做一种有损压缩,MD5算法本身决定了是无法从哈希值还原回原文的。md5算法是非对称加密算法,是hash加密算法,所以解密md5得到的明文不一定正确。