https安全传输建立过程学习

简单过程

以chrome和bilibili网站通信为例:

前提:bilibili向CA机构申请证书

首先是bilibili将自己的信息和公钥放置到证书,然后向CA提交申请,CA核实确实bilibili身份后用自己的私钥对证书进行签名

使用chrome向bilibili发起请求

  1. 浏览器向服务器发起请求
  2. 服务器响应请求,将CA证书发给浏览器
  3. 浏览器获取内置的CA公钥对证书上的签名进行验证,证明服务器的身份(即验证公钥是不是bilibili的),验证成功后获取证书上的公钥
  4. 浏览器生成一段随机数,并使用服务器公钥进行加密(只有bilibili服务器私钥才能解开),发送给服务器
  5. 服务器收到信息后用自己的私钥解密,获得随机数,之后使用这一串随机数作为堆成密钥和浏览器进行对称加密传输(对称密钥只有浏览器和服务器知道)

详细过程

1. 身份认证

  • 浏览器向服务器发起请求,带上一个随机数client Random
  • 服务器响应请求,将一个随机数server RandomCA证书发给浏览器
  • 浏览器获取内置的CA公钥对证书上的签名进行验证,证明服务器的身份(即验证公钥是不是bilibili的),验证成功后获取证书上的公钥serverPublicKey

2. 密钥协商

  • 服务器生成服务器DH参数,并且使用自己的私钥签名,发给客户端
  • 客户端收到后使用服务器公钥serverPublicKey验证签名,获取服务器DH参数
  • 客户端生成客户端DH参数,发给服务端
  • 服务端收到客户端DH参数

3. 对称加密传输

  • 服务端和客户端此时均有client Randomserver Random客户端DH参数服务器DH参数,将四者进行结合生成对称密钥,然后通过对称密钥进行加密传输

补充

1. TLS/SSL

2. RSA非对称加密原理

/* p,q为两个质数 */
let p = 3, q = 11;
let fN = (p - 1) * (q - 1);

/* 公钥 {e,N} */
let e = 7;
let N = p * q;//33
let publicKey = { e, N };

/* 私钥{d,N} */
let d = 1;
while (e * d % fN !== 1) d++;
console.log(d);//3
let privateKey = { d, N };

/* ------------ 测试 ------------ */

/* 公钥加密 */
let m = 5;
let c = Math.pow(m, publicKey.e) % publicKey.N;//c = m^e % N 
console.log('c = ' + c);//c=14

/* 私钥解密 */
let origin = Math.pow(c, privateKey.d) % privateKey.N;//m = c^d % N
console.log(origin);//5

3. Diffie-Heliman原理

/* 公共部分 */
let p = 5, N = 23;

/* A,B各自的密钥 */
let secretA = 6, secretB = 15;

/* A加密 */
let A = Math.pow(p, secretA) % N;
console.log("A = " + A);

/* B加密 */
let B = Math.pow(p, secretB) % N;
console.log("B = " + B);

/* A将A给B,B将B给A */
//A解密
console.log(Math.pow(B, secretA) % N);//2
//B解密
console.log(Math.pow(A, secretB) % N)//2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章