https 公钥与私钥

450 阅读5分钟

对称加密

算法:

加密: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的域名是绑定的。