【计算机网络】HTTPS协议工作流程(原理)

目录

HTTP协议的通信过程

HTTPS协议

特点

工作原理

对称式加密

使用AES实现对称式加密

非对称式加密

 使用RSA实现非对称式加密


HTTP协议的通信过程

        HTTP是应用层协议,它以TCP(传输层)作为底层协议,默认端口为80

  1. 服务器在80端口等待客户的请求。
  2. 浏览器发起到服务器的TCP连接(创建套接字Socket)
  3. 服务器接收来自浏览器的TCP连接
  4. 浏览器(HTTP客户端)与Web服务器(HTTP服务器)交换HTTP 消息
  5. 关闭TCP连接

【计算机网络】HTTPS协议工作流程(原理)_第1张图片

HTTPS协议

特点

  1. 内容加密:采用混合加密技术,中间者无法直接查看明文内容
  2. 验证身份:通过证书认证客户端访问的是自己的服务器
  3. 保护数据完整性:防止传输的内容被中间人冒充或者篡改

工作原理

【计算机网络】HTTPS协议工作流程(原理)_第2张图片

  1. 用户通过浏览器请求 https 网站,服务器收到请求,选择浏览器支持的加密和hash算法,同时返回数字证书给浏览器,包含颁发机构、网址、公钥、证书有效期等信息。
  2. 浏览器对证书的内容进行校验,如果有问题,则会有一个提示警告。否则,就生成随机秘钥X,同时使用证书中的公钥进行加密,并且发送给服务器。
  3. 服务器收到之后,使用私钥解密,得到随机秘钥X,然后使用随机秘钥X对网页内容进行加密,返回给浏览器。
  4. 浏览器则使用随机秘钥X和之前约定的加密算法进行解密,得到最终的网页内容。

对称式加密

        对称密钥加密( Symmetric-Key Encryption ),加密和解密使用同一密钥。

  • 优点:运算速度快。
  • 缺点:无法安全地将密钥传输给通信方。

【计算机网络】HTTPS协议工作流程(原理)_第3张图片

 

使用AES实现对称式加密

package demo;
 
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Base64;
 
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
 
public class AesKit {
	//加密
	public static String encry(String content ,String key) {
		String result = "";
		try {
			//将原始加密内容转换为字节数组
			byte[] source = content.getBytes();
			
			//创建AES加密算法对象
			
			//设置填充方式为PKCS5Padding
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
			
			//创建密钥
			SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES");
			
			//初始化
			//参数1:操作模式,Cipher.ENCRYPT_MODE代表加密操作,Cipher.DECRYPT_MODE代表解密
			//参数2:密钥
			cipher.init(Cipher.ENCRYPT_MODE, secretKey);
			
			//执行最终操作(加密)
			byte[] resultByteArray = cipher.doFinal(source);
			
			//将加密结果(字节数组)使用Base64编码成字符串内容
			result = Base64.getEncoder().encodeToString(resultByteArray);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		}
		return result;	
	}
	
	
	//解密
	public static String decry(String content ,String key) {
		byte[] source = Base64.getDecoder().decode(content);
		String result = "";
		try {			
			//创建AES加密算法对象
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
			
			//创建密钥
			SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES");
			
			//初始化
			//参数1:操作模式,Cipher.ENCRYPT_MODE代表加密操作,Cipher.DECRYPT_MODE代表解密
			//参数2:密钥
			cipher.init(Cipher.DECRYPT_MODE, secretKey);
			
			//执行最终操作(解密)
			byte[] resultByteArray = cipher.doFinal(source);
			
			//将解密结果(字节数组)转成字符串内容
			result = new String(resultByteArray);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		}
		return result;
	}
}

非对称式加密

        非对称密钥加密,又称公开密钥加密( Public-Key Encryption ),加密和解密使用不同的密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。

        非对称密钥除了用来加密,还可以用来进行签名。因为私有密钥铝无法被其他人获取,因此通信发送方使用其私有密钥进行签名,通信接收方使用发送方的公开密钥对签名进行解密,就能判断这个签名是否正确。

  • 优点:可以更安全地将公开密钥传输给通信发送方。
  • 缺点:运算速度慢。

【计算机网络】HTTPS协议工作流程(原理)_第4张图片

 

 使用RSA实现非对称式加密

package demo;
 
import java.security.GeneralSecurityException;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
 
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
 
public class RsaKit {
	//私钥
	PrivateKey sk;
	
	//公钥
	PublicKey pk;
	
	//构造方法
	public RsaKit() throws GeneralSecurityException {
		//创建密钥生成器
		KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");
		kpGen.initialize(1024);//设置长度
		
		//生成"密钥对"
		KeyPair kp = kpGen.generateKeyPair();
		
		//通过"密钥对",分别获取公钥和私钥
		this.sk = kp.getPrivate();
		this.pk = kp.getPublic();
	}
	
	//把私钥导出为字节
	public byte[] getPrivateKey() {
		return this.sk.getEncoded();
	}
	
	//把公钥导出为字节
	public byte[] getPublicKey() {
		return this.pk.getEncoded();
	}
	
	//用公钥加密
	public byte[] encrypt(byte[] message) throws GeneralSecurityException {
		//创建RSA加密算法对象
		Cipher cipher = Cipher.getInstance("RSA");
		
		//初始化
		//参数1:操作模式,Cipher.ENCRYPT_MODE代表加密操作,Cipher.DECRYPT_MODE代表解密
		//参数2:公钥
		cipher.init(Cipher.ENCRYPT_MODE, this.pk);
		
		//执行最终操作(加密)
		byte[] resultByteArray = cipher.doFinal(message);
		
		return resultByteArray;
	}
	
	//用私钥解密
	public byte[] decrypt(byte[] input) throws GeneralSecurityException {
		//创建RSA加密算法对象
		Cipher cipher = Cipher.getInstance("RSA");
		
		//初始化
		//参数1:操作模式,Cipher.ENCRYPT_MODE代表加密操作,Cipher.DECRYPT_MODE代表解密
		//参数2:私钥
		cipher.init(Cipher.DECRYPT_MODE, this.sk);
		
		//执行最终操作(解密)
		return cipher.doFinal(input);
		
		
	}
	
}

你可能感兴趣的:(计算机网络)