>  기사  >  Java  >  SpringBoot가 API 암호화를 구현하는 방법

SpringBoot가 API 암호화를 구현하는 방법

WBOY
WBOY앞으로
2023-05-15 23:10:05830검색

SpringBoot의 API 암호화 도킹

프로젝트에서는 데이터 보안을 보장하기 위해 전송되는 데이터를 암호화하는 경우가 많습니다. 일반적으로 사용되는 암호화 알고리즘에는 대칭 암호화(AES)와 비대칭 암호화(RSA)가 포함됩니다. 블로거는 다음 설명을 위해 Code Cloud에서 가장 간단한 API 암호화 프로젝트를 선택했습니다.

다음은 우리의 가장 밝은 프로젝트입니다

rsa-encrypt-body-spring-boot

프로젝트 소개

이 프로젝트는 RSA 암호화를 사용하여 API 인터페이스에서 반환된 데이터를 암호화하여 API 데이터를 더욱 안전하게 만듭니다. 다른 사람들은 제공된 데이터를 해독할 수 없습니다. Spring Boot 인터페이스 암호화는 주석을 통해 반환 값과 매개변수 값을 자동으로 암호화하고 해독할 수 있습니다.

RSA 암호화란 무엇입니까

먼저 RSA 암호화를 이해해야 합니다

RSA 암호화는 비대칭 암호화입니다. 키를 직접 전달하지 않고도 복호화를 수행할 수 있습니다. 이는 정보의 보안을 보장하고 키의 직접 전송으로 인한 크랙 위험을 방지합니다. 공개키와 개인키라고 불리는 한 쌍의 키를 이용해 암호화하고 복호화하는 과정이다. 둘 사이에는 수학적 상관관계가 있습니다. 이 암호화 알고리즘의 원리는 보안을 보장하기 위해 매우 큰 정수를 인수분해하는 것이 어렵다는 것입니다. 일반적으로 개인 키는 개인 키를 보관하고 공개 키는 공개 키입니다(동시에 여러 사람이 보유할 수 있음).

SpringBoot가 API 암호화를 구현하는 방법

예를 들어보겠습니다

암호화와 서명은 모두 보안상의 이유로 사용되지만 약간 다릅니다. 사람들은 암호화 및 서명에 개인 키를 사용할지 공개 키를 사용할지 자주 묻습니다. 실제로 암호화와 서명의 역할에 대해 모두 혼란스러워하고 있습니다. 쉽게 말하면 암호화는 정보가 유출되는 것을 방지하는 것이고, 서명은 정보가 변조되는 것을 방지하는 것입니다. 다음은 2가지 예입니다.

첫 번째 장면: 전장에서 B는 A에게 특정 지시 사항을 담은 메시지를 보내려고 합니다.

RSA의 암호화 과정은 다음과 같습니다.

(1) A는 한 쌍의 키(공개 키와 개인 키)를 생성합니다. 개인 키는 공개되지 않으며 A가 직접 보관합니다. 공개키는 공개되어 누구나 얻을 수 있습니다.

(2) A는 공개 키를 B에게 전달하고 B는 A의 공개 키를 사용하여 메시지를 암호화합니다.

(3) A는 B가 암호화한 메시지를 수신하고 A의 개인 키를 사용하여 메시지를 해독합니다.

이 과정에서 전송 과정은 2번뿐입니다. 첫 번째는 A가 B에게 공개 키를 전송하는 것이고, 두 번째는 B가 암호화된 메시지를 A에게 전송하는 것입니다. 둘 다 적에게 가로채더라도, A만 개인 키를 사용하여 메시지를 해독할 수 있으므로 위험하지 않으며 메시지 내용의 유출을 방지합니다.

**두 번째 시나리오:**A가 B로부터 메시지를 받은 후 "수신됨"이라고 응답해야 합니다.

RSA 서명 과정은 다음과 같습니다.

(1) A는 한 쌍의 키(공개 키와 개인 키)를 생성합니다. 개인 키는 공개되지 않으며 A가 직접 보관합니다. 공개키는 공개되어 누구나 얻을 수 있습니다.

(2) A는 자신의 개인 키로 메시지에 서명하여 서명을 구성하고 서명된 메시지와 메시지 자체를 B에게 전달합니다.

(3) B는 메시지를 받은 후 서명을 확인하기 위해 A의 공개 키를 얻습니다. 서명 내용이 메시지 자체와 일치하면 A가 메시지에 응답했음을 증명합니다.

이 과정에는 두 가지 전송 과정만 있습니다. 첫 번째는 A가 서명된 메시지와 메시지 자체를 B에게 전송하는 것입니다. 두 번째는 B가 A의 공개 키를 획득하는 것입니다. A의 개인 키만 메시지에 서명할 수 있기 때문입니다. 메시지 내용이 알려져 있더라도 서명된 응답은 B에게 위조될 수 없으므로 메시지 내용이 변조되는 것을 방지할 수 있습니다.

그러나 두 가지 시나리오를 결합하면 첫 번째 시나리오에서는 가로채는 메시지가 유출되지 않지만 가로채는 공개 키를 사용하여 거짓 지침을 암호화한 다음 A에 전달할 수 있다는 것을 알 수 있습니다. 두 번째 시나리오에서는 가로채는 메시지를 변조할 수는 없지만 공개 키 서명 확인을 사용하여 메시지 내용을 얻을 수 있으므로 유출을 방지할 수 없습니다. 따라서 실제 응용에서는 상황에 따라 암호화와 서명을 동시에 사용해야 합니다. 예를 들어 A와 B는 A가 메시지를 보내려고 할 때 자체적인 공개 키 세트를 가지고 있습니다. B에게는 먼저 B의 공개 키 쌍을 사용하여 메시지를 암호화한 다음 A의 개인 키를 사용하여 암호화된 메시지에 서명하므로 메시지가 유출되거나 변조되지 않으며 메시지의 보안이 보장됩니다.

실용적인 암호화

Blogger님, 트윗을 너무 많이 하셔서 RSA가 무엇을 하는지 이미 알고 있습니다. 바로 공개키 암호화, 개인키 복호화, 개인키 서명, 공개키 서명 ​​검증

실습 준비

1. 새로운 springboot 프로젝트 만들기

springboot_api_encryption

2. maven Yilai를 소개합니다

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

. 3. Application 클래스에 @EnableSecurity 주석을 추가하세요

@SpringBootApplication
@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  false
    showLog: true # 是否打印加解密log true  or  false
    publicKey: # RSA公钥 软件生成
    privateKey: # RSA私钥 软件生成

5. 예 컨트롤러의 API 메소드가 암호화되었습니다

@Encrypt
@GetMapping("/encryption")
public TestBean encryption(){
    TestBean testBean = new TestBean();
    testBean.setName("shuibo.cn");
    testBean.setAge(18);
    return testBean;
}

6. 전달된 암호화 매개변수를 해독합니다

다른 Java 종료 프로그램이 주석을 사용할 수 있습니다. Vue인 경우 RSA 키를 사용하여 해독하세요.

@Decrypt
@PostMapping("/decryption")
public String Decryption(@RequestBody TestBean testBean){
    return testBean.toString();
}
실검과 실총

1. Maven을 소개합니다

SpringBoot가 API 암호화를 구현하는 방법

2、启动类添加注解

SpringBoot가 API 암호화를 구현하는 방법

3、YML添加配置密钥

SpringBoot가 API 암호화를 구현하는 방법

4、创建一个实体类

SpringBoot가 API 암호화를 구현하는 방법

5、写一个对外API接口

SpringBoot가 API 암호화를 구현하는 방법

6、启动项目

请求地址: http://localhost:8080/encryption

我们看到返回的数据未加密

SpringBoot가 API 암호화를 구현하는 방법

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가 API 암호화를 구현하는 방법

解密实战

如果是其他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添加解密方法接口

SpringBoot가 API 암호화를 구현하는 방법

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

SpringBoot가 API 암호화를 구현하는 방법

4、后台解密日志

SpringBoot가 API 암호화를 구현하는 방법

总结

经过上面的接口加密解密操作。可以看出我们的接口如果没有公钥、或者私钥别人根本无法解密!这样就对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();
}

위 내용은 SpringBoot가 API 암호화를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제