美文网首页
SpringBoot实战—实现api接口加密

SpringBoot实战—实现api接口加密

作者: 遇见编程 | 来源:发表于2024-07-07 08:04 被阅读0次

RSA加密:
RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被解密的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。

一、加密

1.添加依赖

<dependency>
    <groupId>cn.shuibo</groupId>
    <artifactId>rsa-encrypt-body-spring-boot</artifactId>
    <version>1.0.1.RELEASE</version>
</dependency>

2.在启动类加上@EnableSecurity注解

@SpringBootApplication
@EnableSecurity
public class SpringBootTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpepcDemoApplication.class, args);
    }
}

3.在application.properties中添加RSA公钥及私钥

#开启加密
rsa.encrypt.open=true
#开启打印加密日志
rsa.encrypt.showLog=true
#RSA公钥 在线生成
rsa.encrypt.publicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfJ23W6ru5PNaRn5DsQHXNdbG56M+ZGuk+i+DIc7wkHKtDrXTOBaDoMCZe2P2IPYzkCGqK/kGE0wi3z3LRYRY2rqiyUDCK0INX9Q+JrCHdNM5nBeQ5Sd5enM0QIIhTGqNGFRZW6Fse/oYo2oxuNNqPj/3I+zupe+R3kiy4qNU5wwIDAQAB
#RSA私钥 在线生成
rsa.encrypt.privateKey=MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAN8nbdbqu7k81pGfkOxAdc11sbnoz5ka6T6L4MhzvCQcq0OtdM4FoOgwJl7Y/Yg9jOQIaor+QYTTCLfPctFhFjauqLJQMIrQg1f1D4msId00zmcF5DlJ3l6czRAgiFMao0YVFlboWx7+hijajG402o+P/cj7O6l75HeSLLio1TnDAgMBAAECgYEAxQDpHj/yZFEKWFsXNQqfNTh/I1Id29t/KKGSW0SZRwQsSj4ajTs412KSrU9BXAKCnFm1vWlDbEBmROeWRLRCR3NYOr9mJH5XVTxKZpRp22dJ5rGATCp0+lBVg1gWt4nxBPcAMqOnB9hcA8PL38RkKt5AYScdiwr8lL3jbfS5IAkCQQD92anPiTVAFSH1S3ATlWgwiNQTZqU0xi+b/lGa3zM8o4YvqS9hpzOmu5aEwYGZ3UpkQ2gKM3LxhEvh/N4Cej4/AkEA4Qs3tPjI3Ygek418iHaC6f37fypGqzy8sasK8EBfDa57Q7mUVtDS3R8Yneh3Ke8ebR/Bc3FTWPCsfT6cdb/rfQJBAPZrzHclp6asnQlkkMjB+aFbwhuPQgJn/SF+ELO5xiAwUXuEzfUK/Y32fdgjjG7TrXqFIML+TK99ELiw4sce6bsCQQCo8fLwOZUSOo45144WJGJDqBiWbvZ+tyoxd2bO1oSFkOeZAEkMo9ipiB7C7TIImSsOYTipofogWw4jOE3dWCdBAkEAzQjXn/B2IDi/GkyHdivSNFERdg84Fpm+pEMUmcAGWpj9PMjD/HK4y5OsQDBcEua4X3L1Ir1Esj+qBsgC5cPcXw==

4.对Controller 里面的API方法进行加密

@RestController
public class TestController {
    /**
     * 加密
     * @return
     */
    @Encrypt
    @GetMapping("/encryptTest")
    public Map<String, Object> encrypt() {
        Map<String, Object> map = new HashMap<>();
        map.put("name", "hello");
        map.put("age", 18);
        return map;
    }
}

5.启动程序测试
我们在浏览器访问加密的api请求,发现我们返回的数据已经加密了。

也可以在控制台上看到加密日志的打印。

二.解密

1.添加解密方法接口和接收的实体类

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
</dependency>
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
}
import cn.shuibo.annotation.Decrypt;
import cn.shuibo.annotation.Encrypt;
import com.hjy.springboottest1.pojo.User;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;

@RestController
public class TestController {

    /**
     * 加密
     * @return
     */
    @Encrypt
    @GetMapping("/encryptTest")
    public Map<String, Object> encrypt() {
        Map<String, Object> map = new HashMap<>();
        map.put("name", "hello");
        map.put("age", 18);
        return map;
    }


    /**
     * 解密
     *
     * @param user 加密的用户数据
     * @return 解密后的用户数据
     */
    @Decrypt
    @PostMapping("/decryption")
    public String Decryption(@RequestBody User user) {
        System.out.println(user);
        return user.toString();
    }
}

2.前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
<button onclick="send()">发送加密数据</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 = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfJ23W6ru5PNaRn5DsQHXNdbG56M+ZGuk+i+DIc7wkHKtDrXTOBaDoMCZe2P2IPYzkCGqK/kGE0wi3z3LRYRY2rqiyUDCK0INX9Q+JrCHdNM5nBeQ5Sd5enM0QIIhTGqNGFRZW6Fse/oYo2oxuNNqPj/3I+zupe+R3kiy4qNU5wwIDAQAB';

    /**
     * 加密方法
     * @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 send() {
        var str = {
            "id": 100,
            "name": "zhangsan",
            "age": 15
        };
        $.ajax({
            url: "/decryption",
            type: "POST",
            contentType: "application/json;charset=utf-8",
            data: RSA_encryption(str),
            success: function (data) {
                alert(data);
            }
        })
    }

</script>
</body>
</html>

3.启动程序测试

点击按钮发送加密数据到服务端。
我们在网络请求上面看到发送给服务端的数据确实是加密后的数据。
然后返回解密后的数据给前端。

最后我们在控制台上可以看到相关的解密日志。

3.在线RSA公钥私钥对生成网站

https://config.net.cn/tools/RSA.html

相关文章

网友评论

      本文标题:SpringBoot实战—实现api接口加密

      本文链接:https://www.haomeiwen.com/subject/xglycjtx.html