最后
编程基础的初级开发者,计算机科学专业的学生,以及平时没怎么利用过数据结构与算法的开发人员希望复习这些概念为下次技术面试做准备。或者想学习一些计算机科学的基本概念,以优化代码,提高编程技能。这份笔记都是可以作为参考的。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.69</version>
</dependency>
然后,在Java代码中使用私钥进行解密:
import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.security.Security
import java.security.KeyFactory
import java.security.spec.PKCS8EncodedKeySpec
import java.security.PrivateKey
import javax.crypto.Cipher
// 添加Bouncy Castle作为安全提供者
Security.addProvider(new BouncyCastleProvider())
// 读取私钥信息
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKey);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);
// 使用私钥解密数据
Cipher decryptCipher = Cipher.getInstance("RSA/NONE/PKCS1Padding", "BC");
decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = decryptCipher.doFinal(encryptedData);
实现过程中需要注意:
- 公钥和私钥需要保密,不要将私钥上传到服务器或者提交到版本控制系统中。
- RSA加密算法只能对比较小的数据进行加密,对于比较大的数据需要分段加密。
- 在Java后端中使用Bouncy Castle库可以避免一些兼容性问题。
以下是两条示例说明:
示例一:加密和解密字符串
前端Vue代码:
// 生成密钥对
const crypt = new JSEncrypt({default_key_size: 1024})
const publicKey = crypt.getPublicKey()
const privateKey = crypt.getPrivateKey()
// 将公钥发送给后端,后端需要保存这个公钥
// 加密数据
const crypt = new JSEncrypt()
crypt.setPublicKey(publicKey)
const data = 'Hello, world!'
const encryptedData = crypt.encrypt(data)
// 将加密后的数据发送给后端
后端Java代码:
import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.security.Security
import java.security.KeyFactory
import java.security.spec.PKCS8EncodedKeySpec
import java.security.PrivateKey
import javax.crypto.Cipher
// 添加Bouncy Castle作为安全提供者
Security.addProvider(new BouncyCastleProvider())
// 读取私钥信息
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKey);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);
// 使用私钥解密数据
Cipher decryptCipher = Cipher.getInstance("RSA/NONE/PKCS1Padding", "BC");
decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = decryptCipher.doFinal(encryptedData);
// 输出解密后的数据
System.out.println(new String(decryptedData))
示例二:加密和解密JSON数据
前端Vue代码:
// 生成密钥对
const crypt = new JSEncrypt({default_key_size: 1024})
const publicKey = crypt.getPublicKey()
const privateKey = crypt.getPrivateKey()
// 将公钥发送给后端,后端需要保存这个公钥
// 加密数据
const crypt = new JSEncrypt()
crypt.setPublicKey(publicKey)
const data = {name: 'Alice', age: 25}
const encryptedData = crypt.encrypt(JSON.stringify(data))
// 将加密后的数据发送给后端
后端Java代码:
import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.security.Security
import java.security.KeyFactory
import java.security.spec.PKCS8EncodedKeySpec
#### 总结
三套“算法宝典”
**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**
![28天读完349页,这份阿里面试通关手册,助我闯进字节跳动](https://img-blog.csdnimg.cn/img_convert/921d61c147522637cff31846545fe430.png)
算法刷题LeetCode中文版(为例)
人与人存在很大的不同,我们都拥有各自的目标,在一线城市漂泊的我偶尔也会羡慕在老家踏踏实实开开心心养老的人,但是我深刻知道自己想要的是一年比一年有进步。
最后,我想说的是,无论你现在什么年龄,位于什么城市,拥有什么背景或学历,跟你比较的人永远都是你自己,所以明年的你看看与今年的你是否有差距,不想做咸鱼的人,只能用尽全力去跳跃。祝愿,明年的你会更好!
由于篇幅有限,下篇的面试技术攻克篇只能够展示出部分的面试题,详细完整版以及答案解析,有需要的可以关注
------------------------------------------------------------------