Maison >Java >javaDidacticiel >Comment SpringBoot implémente le chiffrement API
Dans les projets, afin d'assurer la sécurité des données, nous chiffrons souvent les données transmises. Les algorithmes de chiffrement couramment utilisés incluent le chiffrement symétrique (AES) et le chiffrement asymétrique (RSA). Le blogueur a sélectionné le projet de chiffrement API le plus simple sur Code Cloud pour l'explication suivante.
Ce qui suit est notre projet le plus brillant
rsa-encrypt-body-spring-boot
Ce projet utilise le cryptage RSA pour crypter les données renvoyées par l'interface API, rendant les données API plus sécurisées. D'autres ne peuvent pas déchiffrer les données fournies. Le chiffrement de l'interface Spring Boot peut chiffrer et déchiffrer automatiquement les valeurs de retour et les valeurs de paramètres via des annotations.
Tout d'abord, bien sûr, nous devons comprendre le cryptage RSA
Le cryptage RSA est un cryptage asymétrique. Le décryptage peut être effectué sans transmettre directement la clé. Cela garantit la sécurité des informations et évite les risques de piratage dû à la transmission directe des clés. Il s’agit d’un processus de cryptage et de déchiffrement utilisant une paire de clés, appelées respectivement clé publique et clé privée. Il existe une corrélation mathématique entre les deux. Le principe de cet algorithme de chiffrement réside dans la difficulté de factoriser un très grand entier pour assurer la sécurité. Habituellement, les individus conservent les clés privées et les clés publiques sont publiques (elles peuvent être détenues par plusieurs personnes en même temps).
Donnons un exemple
Le cryptage et la signature sont tous deux destinés à des raisons de sécurité, mais ils sont légèrement différents. Les gens demandent souvent s’il faut utiliser des clés privées ou des clés publiques pour le cryptage et les signatures ? En fait, ils sont tous confus quant au rôle du cryptage et de la signature. En termes simples, le cryptage vise à empêcher la fuite d’informations et la signature à empêcher la falsification des informations. Voici 2 exemples.
La première scène : Sur le champ de bataille, B veut envoyer un message à A, dont le contenu est une certaine instruction.
Le processus de cryptage de RSA est le suivant :
(1) A génère une paire de clés (clé publique et clé privée). La clé privée n'est pas rendue publique et est conservée par A lui-même. La clé publique est publique et peut être obtenue par n'importe qui.
(2) A transmet sa clé publique à B, et B utilise la clé publique de A pour chiffrer le message.
(3) A reçoit le message crypté par B et utilise la propre clé privée de A pour déchiffrer le message.
Dans ce processus, il n'y a que 2 processus de transmission. La première fois, c'est lorsque A transfère la clé publique à B, et la deuxième fois, c'est lorsque B transfère le message crypté à A. Même s'ils sont interceptés par l'ennemi, là Il n'y a aucun danger, car seule A Seule la clé privée peut être utilisée pour déchiffrer le message, empêchant ainsi la fuite du contenu du message.
**Deuxième scénario :**Une fois que A a reçu le message de B, il doit répondre « reçu ».
Le processus de signature RSA est le suivant :
(1) A génère une paire de clés (clé publique et clé privée). La clé privée n'est pas rendue publique et est conservée par A lui-même. La clé publique est publique et peut être obtenue par n'importe qui.
(2) A signe le message avec sa propre clé privée pour former une signature, et transmet le message signé et le message lui-même à B.
(3) Après que B ait reçu le message, il obtient la clé publique de A pour vérifier la signature. Si le contenu de la signature est cohérent avec le message lui-même, cela prouve que A répond au message.
Dans ce processus, il n'y a que deux processus de transmission. La première fois, c'est lorsque A transfère le message signé et le message lui-même à B. La deuxième fois, c'est lorsque B obtient la clé publique de A, même s'ils sont interceptés par l'ennemi. il n'y a aucun danger, car seule la clé privée de A peut signer le message. Même si le contenu du message est connu, une réponse signée ne peut pas être falsifiée pour B, empêchant ainsi la falsification du contenu du message.
Cependant, en combinant les deux scénarios, vous constaterez que dans le premier scénario, bien que le message intercepté ne soit pas divulgué, la clé publique interceptée peut être utilisée pour chiffrer les fausses instructions puis les transmettre à A. Dans le deuxième scénario, bien que le message intercepté ne puisse pas être falsifié, le contenu du message peut être obtenu à l'aide d'une vérification de signature par clé publique, ce qui n'empêche pas les fuites. Par conséquent, dans les applications pratiques, il doit être utilisé en fonction de la situation. Le cryptage et la signature peuvent également être utilisés en même temps. Par exemple, A et B ont leur propre ensemble de clés publiques et privées lorsque A souhaite envoyer un message. à B, il utilise d'abord la paire de clés publiques de B. Le message est crypté, puis la clé privée de A est utilisée pour signer le message crypté, afin qu'il ne soit ni divulgué ni falsifié, et que la sécurité du message soit assurée.
Blogueur, tu tweetes tellement, je sais déjà ce que fait RSA. N'est-ce pas juste chiffrement à clé publique, déchiffrement à clé privée, signature à clé privée, vérification de signature à clé publique
1 Créez un nouveau projet springboot
springboot_api_encryption
2. 3. Commencez à ajouter l'annotation @EnableSecurity à la classe Application
<dependency> <groupId>cn.shuibo</groupId> <artifactId>rsa-encrypt-body-spring-boot</artifactId> <version>1.0.1.RELEASE</version> </dependency>
4. Ajoutez la clé publique et la clé privée RSA dans application.yml ou application.properties
L'outil de génération de clés publiques et privées sera publié plus tard dans le article@SpringBootApplication @EnableSecurity public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }5. Oui La méthode API dans le contrôleur est cryptée
rsa: encrypt: open: false # 是否开启加密 true or false showLog: true # 是否打印加解密log true or false publicKey: # RSA公钥 软件生成 privateKey: # RSA私钥 软件生成
6. Décryptez les paramètres de cryptage transmis
D'autres programmes Java peuvent utiliser des annotations. S'il s'agit de vue, veuillez utiliser la clé RSA pour décrypter.@Encrypt @GetMapping("/encryption") public TestBean encryption(){ TestBean testBean = new TestBean(); testBean.setName("shuibo.cn"); testBean.setAge(18); return testBean; }Vraie épée et vrai pistolet
2、启动类添加注解
3、YML添加配置密钥
4、创建一个实体类
5、写一个对外API接口
6、启动项目
请求地址: http://localhost:8080/encryption
我们看到返回的数据未加密
7、修改
修改open为true 打开加密
rsa: encrypt: open: true # 是否开启加密 true or false showLog: true # 是否打印加解密log true or false publicKey: # 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> <script src="https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.js"></script>
2、后台增加解密方法
/** * 解密 * @param user * @return */ @PostMapping("/decryption") @Decrypt @ResponseBody public String Decryption(@RequestBody 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以及方法
Title 加密传后端,后端解密 <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>
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
@PostMapping("/decryption") @Decrypt @ResponseBody public String Decryption(@RequestBody User user){ System.out.println(user.toString()); return user.toString(); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!