1 MD5摘要算法 简介
1.1 消息摘要算法(杂凑算法,哈希算法):主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。
- 一般地,只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同,且相同的输入必会产生相同的输出;
- 只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息,甚至根本就找不到任何与原信息相关的信息;
- 好的摘要算法,没有人能从中找到“碰撞”,但是“碰撞”是肯定存在的。
1.2 应用举例
这里用md5摘要算法来对某个文件进行摘要计算,如果这个文件的大小或者时间做了修改,摘要后的值就会发生变化
2 对称加密算法:采用单钥密码的加密方法,同一个密钥可以同时用作信息的加密和解密
2.1 以常用的对称加密算法AES为例:
- 秘钥为123456:将abc加密为U2FsdGVkX1/jIs2LMTG3oFrmbfTRiU2+ow70BGeKW2o=,反之解密为abc
- 秘钥为654321:将abc解密为U2FsdGVkX1/zzoThQmj1UwJmhcDAsF3+H023utRGvuY=,反之解密为abc
2.2 缺点:
- 首次交换秘钥的环境安全难以保证
- 需要双方共同保证秘钥的安全,还要设计更改秘钥的流程以防备秘钥泄露
3 非对称加密算法:采用一对秘钥,即两个密钥来进行加密和解密。这一对密钥分别是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
3.1 特点:
- 公钥大家都有,没啥私密性
- 用公钥加密的内容,只能用对应的私钥来解密;用私钥加密的内容,只能用对应的公钥来解密
- 想利用公钥破解私钥,需要很长的时间,以目前的算力破解2048位的密钥要80年以上
3.2 举个例子
- 用户A生成自己的一对秘钥,公钥+私钥
- A把公钥给B,私钥自己保存,只有自己知道,不对外透露
- B想和A说私密的内容
3.3 安全隐患:中间人攻击
- 中间人C生成两对秘钥,公钥1+私钥1;公钥2+私钥2
- C跟A谎称自己是B,把公钥1给A;C又跟B谎称说自己是A,把公钥2给B
- 然后C在中间开始搞事情
- 中间人攻击的根本原因:无法确定公钥的真实性
- 解决办法:
- 通过大众媒体大范围的公布公钥,使公钥不可能造假
- 操作系统或浏览器内置公钥,即创建根证书
3.4 非对称加密的正确玩法
- 有个可靠的机构,有一对公钥和私钥,假设为公钥root+私钥root
- 公钥root已经传播到全世界,每个人手上都有,包括A和B,不能作假
- A和B想有一套自己的秘钥对,自己沟通
- A向该机构申请生成一对自己的秘钥对,假设为公钥A+私钥A
- 机构用私钥root把公钥A加密发给B,B用公钥root解密成功,说明公钥A是可靠的
- A有了私钥A,B有了公钥A,两者开始愉快的沟通
- 流程图解如下:
- 结论:用一对可靠的公钥和秘钥,可以对外传递无数对的新的公钥和私钥
- 证书链:基于上述结论,有了证书链的概念,即将由某对公钥私钥生成的新的公钥私钥中的公钥做成子证书,子生孙孙生子,构成一个链条,如下所示:
4 非对称加密和https
4.1 https的流程
- 企业向可靠的机构申请属于自己的公钥和私钥
- 企业把公钥和私钥保存到自己的服务器
- 个人的客户端浏览器向服务器发起请求
- 服务器把公钥发送给客户端
- 个人通过证书链验证公钥的可靠性
- 企业:拿到私钥;个人:拿到公钥?开始愉快的交流(并不是这样的)
- 个人生成一串用于对称加密的key,用公钥加密以后发送给企业,然后双方用这个key进行对称加密交流
- 因为前面提到了,对称加密简单效率高,非对称加密速度慢效率低
- 用非对称加密解决对称加密的痛点,然后使用对称加密就可以了
- 流程如下
4.2 补充知识点:数字签名
服务器发给客户端的公钥,万一被中间人修改了呢?
解决办法,使用数字签名:
- 将公钥进行HASH,再用私钥进行加密得到密文,把密文和公钥一起发送给客户端
- 客户端拿到公钥后,会用相同的HASH算法重新算一遍,得到一个HASH值hash1
- 用公钥解密数字签名得到HASH值hash2
- 如果hash1等于hash2就证明这个公钥是没有被中间人修改的
- 即使中间人修改了公钥的内容,他因为没有私钥可以重新生成数字签名,所以无法造假