对称加密
算法:
加密:f1(k, data) = x
解密:f2(k, x) = data
1、c -> s 客户端向服务端索要公钥 2、s -> c 服务端给客户端传递公钥 k 3、c -> s 客户端f1 方法加密 传输密文 4、s 调用f2 解密 5、s -> c 调用f1 解密
缺点:k难维护,因此只有一个、任意黑客都能拿到k,因此劫持难度较小
解决思维:如果每个客户端都有唯一的key那就能确保黑客解不了数据
非对称加密
算法:公钥 + 私钥
公钥加密 -> 私钥解密 私钥加密 -> 公钥解密
1、c -> s 客户端向服务端索要公钥
2、s -> c 服务端传递公钥 k
3、c -> s 客户端公钥加密,只能通过服务端私钥解密
缺点:客户端向服务端发送数据是安全的,但服务端怎么向客户端发送数据,使用私钥加密的话,那黑客也可以拿到公钥进行解密
解决思维:客户端向服务端发送数据是安全端 因为进行了公钥加密,只是服务端向客户端发送数据是不安全端
非对称加密 + 对称加密
1、客户端向服务端索要公钥(注意这里容易出问题)
2、客户端通过公钥使用非对称加密 加密后将随机字符串发送给服务端
3、服务端私钥解密通过这个随机字符串进行拼接 得到一个唯一端key 进行对称加密端key
缺点: 还是可以进行拦截!
1、黑客拦截了第一步 伪造公钥给客户端(此时黑客有自己的非堆成加密算法f,私钥在他那里,所以他可以根据客户端传过来的公钥进行解密), 然后再去伪装向服务端要一个公钥
2、客户端通过伪造端公钥使用字符串进行加密传给了黑客,黑客可以进行解析得到字符串
中间人产生的问题
引入一个CA (权威机构颁发的证书),只有他产生的公钥是合法的公钥,其他都是不合法的
具体过程是这样的
1、客户端向服务端索要公钥时,服务端不会直接给他,而是通过加密算法进行加密(加密过程是 依赖CA与公钥进行非对称加密得到一个license)
算法这样的:f(csk, pk) = license
csk 是ca的密钥 pk是客户端与服务端联系的公钥 license 证书
2、那客户端只需要知道cpk(ca公钥)就能知道pk了,那客户端去索要 cpk岂不是也会出问题
3、客户端索性不去服务端索要 cpk,直接本地产生就行了
是否这样就是安全的呢?
模拟一下访问百度的过程?
- 1、 c -> s 请求中携带了本次请求支持的SSl版本,使用非堆成算法,随机数1
- 2、 s -> c 使用 SSl1.0 版本, 我们使用的对称算法, 随机数2,并将license证书放到里面
- 3、 c 证书认证
- 4、 c 认证成功 c -> s 随机数3 通过随机数 f(1 2) 生成一个 x
- 5、 服务端 也会调用 f(1,2) 生成一个x 看是否与 客户端的x 一样 再使用 随机数1、2、3生成一个key
- 6、 s -> c 就不再使用公钥了
证书CA体现的过程
a.服务方S向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证; (不交私钥)
b.CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
c.如信息审核通过,CA会向申请者签发认证文件-证书。
证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;
签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用CA的私钥对信息摘要进行加密,密文即签名;
d.客户端 C 向服务器 S 发出请求时,S 返回证书文件;
e.客户端 C读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
f.客户端然后验证证书相关的域名信息、有效时间等信息;
g.客户端会内置信任****CA的证书信息(包含公钥) ,如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。
在这个过程注意几点:
a.申请证书不需要提供私钥,确保私钥永远只能服务器掌握;
b.证书的合法性仍然依赖于非对称加密算法,证书主要是增加了服务器信息以及签名;
c.内置 CA 对应的证书称为根证书,颁发者和使用者相同,自己为自己签名,即自签名证书(为什么说"部署自签SSL证书非常不安全")
d.证书=公钥(服务方生成密码对中的公钥)+申请者与颁发者信息+签名(用CA机构生成的密码对的私钥进行签名) ;
即便有人截取服务器A证书,再发给客户端,想冒充服务器A,也无法实现。因为证书和url的域名是绑定的。