加密通信的基本概念
1.公钥密码体制:公钥、私钥、加密解密算法。
- 加密:通过加密算法和公钥对内容进行加密,得到密文。
- 解密:通过解密算法和私钥对密文进行解密。
例1:RSA密码体制
2.加密解密算法
- 1.对称加密算法:加密使用的密钥和解密使用的密钥是相同的,没有公私分明,使用时需要保证密钥的安全性
- 2.非对称加密算法:加密使用的密钥和解密使用的密钥是相同的
PS:HTTPS采用共享密钥加密和公开密钥加密两者并用的机制。
①使用公开密钥加密方式安全地交换在稍后的共享密钥加密中要使用的密钥
②确保交换的密钥是安全的前提下,使用共享密钥加密方式进行通信(处理速度大大加快)
3.签名:
在信息的后面再加上一段内容,可以证明信息没有被修改过。一是对信息做一个hash计算得到一个hash值,如MD5加密。这是一个不可逆的过程。为了确保hash值不可被他人攻击,通常会对hash值也做一层加密。
4.MD5:
将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。
- 1.MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。
- 2.被黑客使用最多的一种破译密码的方法就是一种被称为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字节,排列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。
5.数字证书
问题:服务器如何想移动端证明自己生成的公钥是正确的?
解答:通过数字证书
主要内容:
1)证书的发布机构
2)证书的有效期
3)公钥
4)证书的所有者
5)签名所使用的算法
6)指纹以及指纹算法
6.token
计算机技术发展这么多年,安全验证的技术也是很多种,大家熟悉有: BaseAuth, Oauth, Oauth2,基于Token的认证等机制。现在比较流行,大家常用的就是token认证的方式。
token的生成一般是采用uuid保证唯一性,当用户登录时为其生成唯一的token,存储一般保存在数据库中。token过期时间采用把token二次保存在cookie或session里面,根据cookie和session的过期时间去维护token的过期时间。至于采用那种存储一般需要根据应用程序部署的环境,如果你的应用部署在多台机器上,使用nginx进行负载均衡,那么需要把token二次保存在cookie中。
怎么保证用户使用状态下token持续时间的一直有效?这需要依赖框架的一种机制,大家应该都挺熟悉的,那就是aop技术(面向切面编程),在Yii2框架里面一般采用behavior来实现,主要内容就是在给用户行为的api controller添加一个before action。在action里面,从cookie中获取token,拿取用户信息,如果用户有操作的权限,就根据当前时间去更新cookie的过期时间,从而维护token的持续时间,使得token在给定时间内不会过期,这样可以使用户的操作体验达到最佳,又能起到保护程序安全的作用。
7.一个完整的加密通信过程
1)客户端向服务端发送请求
2)服务端向客户端发送自己的数字证书,证书包含公钥
3)客户端校验证书是否正确。如果正确(并不代表对方就是服务器),发送一个随机数给服务端用私钥加密,自己用公钥去解密这个字符串,看是否能匹配上。如果匹配上,则说明对方确实是服务器
4)客户端生成一个对称加密算法,之后的内容会用这个对称加密进行加解密。客户端用公钥加密这个对称加密算法和密钥,发送给服务端。之后双方的通信就按这个方式展开了。
8.思考问题
1)HTTP时代,密码怎么传输保证安全
我们可以利用MD5的不可逆加密来传输密码。当然也不可能直接给密码加个MD5,因为那样生产的散列字符串没有时效性,只要密码没修改都有效。
所以,我们可以在这个字符串中加入一些时间元素来使这个这个密码变成一个临时密码,这样的临时密码即使被截获了也会因为时效性原因而无法利用。但是这也有个缺陷,就是客户端时间必须准确,虽然服务器程序上设置允许两分钟的误差,但是如果客户端的时间差太多就无法登录。解决的方法可以使用临时token,就是让客户端不用时间作为凭证,而是登录前去服务器取个凭证然后用这个凭证做临时密码。这个方法虽然可以解决问题,但是需要消耗一次HTTP请求。目前最简单有效的方法就是这个,至于在项目中如何取舍就看开发者自己的意愿了。
2)通信被拦截了怎么办
3)别人抓到MD5之后模拟请求怎么办
4)MD5也有破解方法,怎么办