HTTPS之加密解密学习

一、背景

1、一直不太明白面试为什么要问那么多八股,实际工作之后才慢慢发现那些都是基础,工具的使用都是基于计网基础的,而最近我的抓包工具一直用不了,出现如“SSL握手失败”“HTTPS响应已加密”“启用SSL代理查看内容”等问题。

提示信息为HTTPS响应已加密,就牵扯出一系列问题:HTTP的工作机制,为什么会有HTTPS,怎么加密?如何解密?HTTPS的工作机制是什么?

针对抓包问题搜索之后无果,解决方案几乎没有,于是挖了HPPTS的文章,跟着作者的思路看完之后收获颇多。

二、HTTPS

先写结论:

HTTP协议为明文传输,因此抓包工具可以直接获取到请求和响应结果,这也让更改与窃取通信双方的通信内容变得更加容易,于是就有了HTTPS 的存在,可以理解为是在HTTP传输工程中增加了加密解密过程的协议,也就是利用ssl加密协议进行加密,抓包得到的内容没有密钥也无法解密,加强了通讯的安全性

冲突域:共享同一个带宽的域,假设一条高速通道,四辆车想同时通过,如果一次只能过一辆,那么四辆车都想通过的这个条件就发生了冲突,如果按顺序一辆一辆地通过,那么该高速则是他们共享的通道,若将四个车最初到收费站的高速路线看作线缆,车看作主机设备,收费站看作集线器,他们与集线器的这一区域就形成了冲突域。

三、非对称加密和对称加密

假设客户端和服务端需要通信

1、对称加密

服务端和客户端传输时发送密钥加密后的密文和密钥,通过相同的密钥对其解密

 2、非对称加密

加密和解密的密钥不相同,即公钥和私钥,公钥public为公开的,可以被任何人拿到,而私钥private不公开,用于解密

1、 非对称加密的过程

1、服务端生成一对公钥和私钥,公钥公开,客户端以及任何人都可拿到,私钥只有服务端有

2、客户端用公钥对对自己的对称密钥进行加密,将加密后的密钥传给服务器

3、服务器通过私钥对该请求的秘文解密,得到对称密钥

4、双方传输文件时发送对称加密后的秘文,并对其用对称密钥解密(不用非对称加密,是为了节省成本,)以此提高安全性

黑客攻击:中间人生成private2和public2,拦截服务端发给客户端的public1,将public2发给客户端,客户端用public2对其密钥加密,被拦截,并用private2对密文解密,得到密钥,再次用public1对密文加密,发送给服务端,服务端用private1对其解密,得到密钥,后续继续传输信息,都被黑客解密

证书:公钥+身份识别

CA证书:防止黑客篡改公钥,用于身份认证,以确保公钥的真实性

服务端申请证书后,第三方机构会返回包含公钥和身份标识的证书,黑客申请不到,服务器公开申请的证书所有人都能拿到,此时黑客拿到证书后无法篡改其中的公钥,若篡改,客户端用改后的证书去第三方验证,返回不合法的结果,识破黑客篡改;

客户端拿到服务端返回的证书去第三方机构验证是否合法,若合法则其中的公钥匙正确的

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Java中实现SM2加密解密,您可以使用bcprov库。在使用之前,您需要确保已经导入了bcprov-ext-jdk15on-151.jar和bcprov-jdk15on-151.jar这两个包。 首先,您需要生成SM2的密钥对。可以使用以下代码生成密钥对: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.Security; public class SM2Example { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("SM2", "BC"); KeyPair keyPair = keyPairGenerator.generateKeyPair(); byte[] publicKey = keyPair.getPublic().getEncoded(); byte[] privateKey = keyPair.getPrivate().getEncoded(); System.out.println("公钥: " + Hex.toHexString(publicKey)); System.out.println("私钥: " + Hex.toHexString(privateKey)); } } ``` 然后,您可以使用以下代码进行SM2加密和解密: ```java import org.bouncycastle.asn1.ASN1Integer; import org.bouncycastle.asn1.DERSequence; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.crypto.InvalidCipherTextException; import org.bouncycastle.crypto.engines.SM2Engine; import org.bouncycastle.crypto.params.ECPrivateKeyParameters; import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.crypto.util.PrivateKeyInfoFactory; import org.bouncycastle.crypto.util.SubjectPublicKeyInfoFactory; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; public class SM2Example { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 加载公钥和私钥 byte[] publicKeyBytes = Hex.decode("公钥"); byte[] privateKeyBytes = Hex.decode("私钥"); KeyFactory keyFactory = KeyFactory.getInstance("SM2", "BC"); X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes); PublicKey publicKey = keyFactory.generatePublic(publicKeySpec); PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes); PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec); // 加密 SM2Engine engine = new SM2Engine(); engine.init(true, new ECPublicKeyParameters((ECPublicKey) publicKey, SM2Util.DOMAIN_PARAMETERS)); byte[] plaintext = "要加密的数据".getBytes(); byte[] encrypted = engine.processBlock(plaintext, 0, plaintext.length); System.out.println("加密结果: " + Hex.toHexString(encrypted)); // 解密 engine.init(false, new ECPrivateKeyParameters((ECPrivateKey) privateKey, SM2Util.DOMAIN_PARAMETERS)); byte[] decrypted = engine.processBlock(encrypted, 0, encrypted.length); System.out.println("解密结果: " + new String(decrypted)); } } ``` 请注意,这只是一个基础的示例,您可能需要根据您的具体需求进行修改和完善。另外,您还可以通过了解更多关于bcprov库的文档和示例来深入学习和使用SM2加密解密。<span class="em">1</span> #### 引用[.reference_title] - *1* [SM2加密解密JAVA版本.zip](https://download.csdn.net/download/kill_bugs/13500151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值