# 项目介绍
# 什么是RSA加密

举例子大法 加密和签名都是为了安全性考虑,但略有不同。常有人问加密和签名是用私钥还是公钥?其实都是对加密和签名的作用有所混淆。简单的说,加密是为了防止信息被泄露,而签名是为了防止信息被篡改。这里举2个例子说明。 「第一个场景:」战场上,B要给A传递一条消息,内容为某一指令。 RSA的加密过程如下:
-
A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。 -
A传递自己的公钥给B,B用A的公钥对消息进行加密。 -
A接收到B加密的消息,利用A自己的私钥对消息进行解密。
-
A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。 -
A用自己的私钥对消息加签,形成签名,并将加签的消息和消息本身一起传递给B。 -
B收到消息后,在获取A的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是A回复的。
# 加密实战
实战准备
1、新建一个springboot项目
2、引入maven依来
<dependency><groupId>cn.shuibo</groupId><artifactId>rsa-encrypt-body-spring-boot</artifactId><version>1.0.1.RELEASE</version></dependency>
3、启动类Application中添加@EnableSecurity注解
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
4、在application.yml或者application.properties中添加RSA公钥及私钥
公钥私钥的生成文章后面会放出生成工具 rsa:encrypt:open: false # 是否开启加密 true or falseshowLog: true # 是否打印加解密log true or falsepublicKey: # RSA公钥 软件生成privateKey: # RSA私钥 软件生成
5、对Controller 里面的API方法进行加密
("/encryption")public TestBean encryption(){TestBean testBean = new TestBean();testBean.setName("shuibo.cn");testBean.setAge(18);return testBean;}
6、对传过来的加密参数解密
其他java端程序可以用注解,如果是vue,请用RSA密钥解密 public String Decryption( TestBean testBean){return testBean.toString();}真刀真枪
1、引入maven
2、启动类添加注解
3、YML添加配置密钥
4、创建一个实体类
5、写一个对外API接口
6、启动项目
❝请求地址: http://localhost:8080/encryption❞ 我们看到返回的数据未加密 7、修改
修改open为true 打开加密 rsa:encrypt:open: true # 是否开启加密 true or falseshowLog: true # 是否打印加解密log true or falsepublicKey: # RSA公钥 软件生成privateKey: # RSA私钥 软件生成
8、再次重启项目
❝请求地址: http://localhost:8080/encryption❞ 我们看到返回的数据已加密 9、加密日志
# 解密实战
如果是其他springboot项目,跟前面一样。我们这儿就当客户端是springboot项目,其他的请使用RSA解密协议解密! 服务端有私密钥、公密钥 前端只需要公密钥就可以 实战准备
在原来的springboot基础上写一份解密方法
1、前端js解密方法
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script><scriptsrc="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.js"></script>2、后台增加解密方法 /*** 解密* @param user* @return*/public String Decryption( User user){System.out.println(user.toString());return user.toString();}
3、js方法
#公钥var PUBLIC_KEY = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAobhGH4WMwMvJRUlTxWrCVIOQtsHijAxPJNvAWAgq80ADpFEWrpbcGB9cKqp6XHRH4k/CVtCUZ7jm9UKwhaeAm18sKtcwe+M8JFNX6FSHpgde0o8C9S/QpcmLxf4iN7nGZ7P3ZTvMdmKUcdRMsVQnsydG2Bj6gRxP2+kexEebTeODbdM7dHlkxAL0RxGWmX/ZOBzsoWZw2gKcC0vxwyIZBGHUdImG2T3nEA+VMfK2Yqv3uSYukmlKP+0mjfhrTtLFDuTV1VER9BfryBMvpQCxLO4pqgZnXPd+SOQcZHZ2OL0wqo5OX1+GPYx7TNxz5Qi76pK//T2mH7s6X/BuyT21HQIDAQAB';/*** 加密方法* @returns {PromiseLike<ArrayBuffer>}* @constructor*/function RSA_encryption(jsonData) {var encrypt = new JSEncrypt();encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');var encrypted = encrypt.encrypt(JSON.stringify(jsonData));console.log('加密前数据:%o', str);console.log('加密后数据:%o', encrypted);return encrypted;}/*** 提交方法*/function tijiao() {var str = {"name":"1223334","password":"asd",age:1};$.ajax({url: "/decryption",type : "POST",contentType: "application/json;charset=utf-8",data : RSA_encryption(str) ,success : function(data) {alert(data);}})}
真刀真枪
1、 Controller添加解密方法接口
2、前端页面引入js以及方法
<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body>加密传后端,后端解密<button id="jiami" onclick="tijiao()">加密传后端</button><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.js"></script><script>var PUBLIC_KEY = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAobhGH4WMwMvJRUlTxWrCVIOQtsHijAxPJNvAWAgq80ADpFEWrpbcGB9cKqp6XHRH4k/CVtCUZ7jm9UKwhaeAm18sKtcwe+M8JFNX6FSHpgde0o8C9S/QpcmLxf4iN7nGZ7P3ZTvMdmKUcdRMsVQnsydG2Bj6gRxP2+kexEebTeODbdM7dHlkxAL0RxGWmX/ZOBzsoWZw2gKcC0vxwyIZBGHUdImG2T3nEA+VMfK2Yqv3uSYukmlKP+0mjfhrTtLFDuTV1VER9BfryBMvpQCxLO4pqgZnXPd+SOQcZHZ2OL0wqo5OX1+GPYx7TNxz5Qi76pK//T2mH7s6X/BuyT21HQIDAQAB';/*** 加密方法* @returns {PromiseLike<ArrayBuffer>}* @constructor*/function RSA_encryption(jsonData) {var encrypt = new JSEncrypt();encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');var encrypted = encrypt.encrypt(JSON.stringify(jsonData));console.log('加密前数据:%o', jsonData);console.log('加密后数据:%o', encrypted);return encrypted;}/*** 提交方法*/function tijiao() {var str = {"name":"1223334","password":"asd",age:1};$.ajax({url: "/decryption",type : "POST",contentType: "application/json;charset=utf-8",data : RSA_encryption(str) ,success : function(data) {alert(data);}})}</script></body></html>3、启动访问
http://localhost:8080 4、后台解密日志
# 总结
经过上面的接口加密解密操作。可以看出我们的接口如果没有公钥、或者私钥别人根本无法解密!这样就对API接口起到了很好的保护作用,防止别人抓包! 项目坑点
此项目的demo无法访问,难点就在前端如何加密回传到后台解密,此坑我带大家爬出来了! 以下是主意事项: 1、主意ajax的 contentType: “application/json;charset=utf-8” $.ajax({url: "/decryption",type : "POST",contentType: "application/json;charset=utf-8",data : RSA_encryption(str) ,success : function(data) {alert(data);}})2、解密方法必须 @RequestBody public String Decryption( User user){System.out.println(user.toString());return user.toString();}源代码获取: ❝https://github.com/pengziliu/GitHub-code-practice❞
热门推荐
isEmpty 和 isBlank 的用法区别,居然一半的人答不上来..... “开源Windows”ReactOS聘请全职开发者,改进GUI设置 Java编程教程-HashMap和Hashtable之间的区别 本篇文章来源于微信公众号: Java面试那些事儿
微信扫描下方的二维码阅读本文














热门推荐
Comments NOTHING