• 【计算机网络】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. 内容加密:采用混合加密技术,中间者无法直接查看明文内容
    2. 验证身份:通过证书认证客户端访问的是自己的服务器
    3. 保护数据完整性:防止传输的内容被中间人冒充或者篡改

    工作原理

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

    对称式加密

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

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

     

    使用AES实现对称式加密

    1. package demo;
    2. import java.security.InvalidAlgorithmParameterException;
    3. import java.security.InvalidKeyException;
    4. import java.security.NoSuchAlgorithmException;
    5. import java.security.SecureRandom;
    6. import java.util.Arrays;
    7. import java.util.Base64;
    8. import javax.crypto.BadPaddingException;
    9. import javax.crypto.Cipher;
    10. import javax.crypto.IllegalBlockSizeException;
    11. import javax.crypto.NoSuchPaddingException;
    12. import javax.crypto.SecretKey;
    13. import javax.crypto.spec.IvParameterSpec;
    14. import javax.crypto.spec.SecretKeySpec;
    15. public class AesKit {
    16. //加密
    17. public static String encry(String content ,String key) {
    18. String result = "";
    19. try {
    20. //将原始加密内容转换为字节数组
    21. byte[] source = content.getBytes();
    22. //创建AES加密算法对象
    23. //设置填充方式为PKCS5Padding
    24. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    25. //创建密钥
    26. SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES");
    27. //初始化
    28. //参数1:操作模式,Cipher.ENCRYPT_MODE代表加密操作,Cipher.DECRYPT_MODE代表解密
    29. //参数2:密钥
    30. cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    31. //执行最终操作(加密)
    32. byte[] resultByteArray = cipher.doFinal(source);
    33. //将加密结果(字节数组)使用Base64编码成字符串内容
    34. result = Base64.getEncoder().encodeToString(resultByteArray);
    35. } catch (NoSuchAlgorithmException e) {
    36. e.printStackTrace();
    37. } catch (NoSuchPaddingException e) {
    38. e.printStackTrace();
    39. } catch (IllegalBlockSizeException e) {
    40. e.printStackTrace();
    41. } catch (BadPaddingException e) {
    42. e.printStackTrace();
    43. } catch (InvalidKeyException e) {
    44. e.printStackTrace();
    45. }
    46. return result;
    47. }
    48. //解密
    49. public static String decry(String content ,String key) {
    50. byte[] source = Base64.getDecoder().decode(content);
    51. String result = "";
    52. try {
    53. //创建AES加密算法对象
    54. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    55. //创建密钥
    56. SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES");
    57. //初始化
    58. //参数1:操作模式,Cipher.ENCRYPT_MODE代表加密操作,Cipher.DECRYPT_MODE代表解密
    59. //参数2:密钥
    60. cipher.init(Cipher.DECRYPT_MODE, secretKey);
    61. //执行最终操作(解密)
    62. byte[] resultByteArray = cipher.doFinal(source);
    63. //将解密结果(字节数组)转成字符串内容
    64. result = new String(resultByteArray);
    65. } catch (NoSuchAlgorithmException e) {
    66. e.printStackTrace();
    67. } catch (NoSuchPaddingException e) {
    68. e.printStackTrace();
    69. } catch (IllegalBlockSizeException e) {
    70. e.printStackTrace();
    71. } catch (BadPaddingException e) {
    72. e.printStackTrace();
    73. } catch (InvalidKeyException e) {
    74. e.printStackTrace();
    75. }
    76. return result;
    77. }
    78. }

    非对称式加密

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

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

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

     

     使用RSA实现非对称式加密

    1. package demo;
    2. import java.security.GeneralSecurityException;
    3. import java.security.InvalidKeyException;
    4. import java.security.KeyPair;
    5. import java.security.KeyPairGenerator;
    6. import java.security.NoSuchAlgorithmException;
    7. import java.security.PrivateKey;
    8. import java.security.PublicKey;
    9. import javax.crypto.Cipher;
    10. import javax.crypto.NoSuchPaddingException;
    11. import javax.crypto.SecretKey;
    12. import javax.crypto.spec.SecretKeySpec;
    13. public class RsaKit {
    14. //私钥
    15. PrivateKey sk;
    16. //公钥
    17. PublicKey pk;
    18. //构造方法
    19. public RsaKit() throws GeneralSecurityException {
    20. //创建密钥生成器
    21. KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");
    22. kpGen.initialize(1024);//设置长度
    23. //生成"密钥对"
    24. KeyPair kp = kpGen.generateKeyPair();
    25. //通过"密钥对",分别获取公钥和私钥
    26. this.sk = kp.getPrivate();
    27. this.pk = kp.getPublic();
    28. }
    29. //把私钥导出为字节
    30. public byte[] getPrivateKey() {
    31. return this.sk.getEncoded();
    32. }
    33. //把公钥导出为字节
    34. public byte[] getPublicKey() {
    35. return this.pk.getEncoded();
    36. }
    37. //用公钥加密
    38. public byte[] encrypt(byte[] message) throws GeneralSecurityException {
    39. //创建RSA加密算法对象
    40. Cipher cipher = Cipher.getInstance("RSA");
    41. //初始化
    42. //参数1:操作模式,Cipher.ENCRYPT_MODE代表加密操作,Cipher.DECRYPT_MODE代表解密
    43. //参数2:公钥
    44. cipher.init(Cipher.ENCRYPT_MODE, this.pk);
    45. //执行最终操作(加密)
    46. byte[] resultByteArray = cipher.doFinal(message);
    47. return resultByteArray;
    48. }
    49. //用私钥解密
    50. public byte[] decrypt(byte[] input) throws GeneralSecurityException {
    51. //创建RSA加密算法对象
    52. Cipher cipher = Cipher.getInstance("RSA");
    53. //初始化
    54. //参数1:操作模式,Cipher.ENCRYPT_MODE代表加密操作,Cipher.DECRYPT_MODE代表解密
    55. //参数2:私钥
    56. cipher.init(Cipher.DECRYPT_MODE, this.sk);
    57. //执行最终操作(解密)
    58. return cipher.doFinal(input);
    59. }
    60. }

  • 相关阅读:
    日常学习记录随笔-大数据之日志(hadoop)收集实战
    Java EE --- Spring 的创建和使用
    网络安全CTF流量分析-入门3-Webshell连接流量分析
    opencv+tkinter来在GUI内读取视频或摄像头
    redis 哨兵,高可用的执行者
    K8S-PV与PVC
    【深度学习实践(四)】识别验证码
    Avalonia 部署到麒麟信安操作系统
    Spring 10: AspectJ框架 + @Before前置通知
    基于SqlSugar的开发框架循序渐进介绍(12)-- 拆分页面模块内容为组件,实现分而治之的处理
  • 原文地址:https://blog.csdn.net/weixin_46005032/article/details/127775982