Rumah  >  Artikel  >  Java  >  Bagaimana SpringBoot melaksanakan penyulitan api

Bagaimana SpringBoot melaksanakan penyulitan api

WBOY
WBOYke hadapan
2023-05-15 23:10:05825semak imbas

Penyulitan API SpringBoot

Dalam projek, untuk memastikan keselamatan data, kami sering menyulitkan data yang dihantar. Algoritma penyulitan yang biasa digunakan termasuk penyulitan simetri (AES) dan penyulitan asimetri (RSA) Blogger memilih projek penyulitan API yang paling mudah pada Code Cloud untuk penjelasan berikut.

Sila senaraikan projek kami yang paling terang di bawah

rsa-encrypt-body-spring-boot

Pengenalan projek

Projek ini menggunakan kaedah penyulitan RSA Sulitkan data dikembalikan oleh antara muka API untuk menjadikan data API lebih selamat. Orang lain tidak boleh mentafsir data yang diberikan. Penyulitan antara muka Spring Boot boleh secara automatik menyulitkan dan menyahsulit nilai pulangan dan nilai parameter melalui anotasi.

Apakah penyulitan RSA

Pertama sekali, sudah tentu kita perlu memahami penyulitan RSA

Penyulitan RSA ialah penyulitan asimetrik. Penyahsulitan boleh dilakukan tanpa menghantar kunci secara langsung. Ini memastikan keselamatan maklumat dan mengelakkan risiko retak akibat penghantaran terus kunci. Ia adalah satu proses penyulitan dan penyahsulitan menggunakan sepasang kunci, masing-masing dipanggil kunci awam dan kunci persendirian. Terdapat korelasi matematik antara kedua-duanya Prinsip algoritma penyulitan ini ialah kesukaran memfaktorkan integer yang sangat besar untuk memastikan keselamatan. Biasanya individu menyimpan kunci peribadi dan kunci awam adalah awam (mungkin dipegang oleh berbilang orang pada masa yang sama).

Bagaimana SpringBoot melaksanakan penyulitan api

Contohnya,

Penyulitan dan tandatangan kedua-duanya adalah atas sebab keselamatan, tetapi berbeza sedikit. Orang sering bertanya sama ada hendak menggunakan kunci persendirian atau kunci awam untuk penyulitan dan tandatangan? Malah, mereka semua keliru tentang peranan penyulitan dan tandatangan. Ringkasnya, penyulitan adalah untuk mengelakkan maklumat daripada bocor, dan tandatangan adalah untuk mengelakkan maklumat daripada diganggu. Berikut adalah 2 contoh.

Adegan pertama: Di medan perang, B ingin menghantar mesej kepada A, yang kandungannya adalah arahan tertentu.

Proses penyulitan RSA adalah seperti berikut:

(1) A menghasilkan sepasang kunci (kunci awam dan kunci persendirian tidak didedahkan dan A menyimpannya). dirinya sendiri. Kunci awam adalah awam dan boleh diperolehi oleh sesiapa sahaja.

(2) A menyerahkan kunci awamnya kepada B, dan B menggunakan kunci awam A untuk menyulitkan mesej.

(3) A menerima mesej yang disulitkan oleh B dan menggunakan kunci peribadi A sendiri untuk menyahsulit mesej.

Dalam proses ini, hanya terdapat dua proses penghantaran Kali pertama ialah A menghantar kunci awam kepada B, dan kali kedua B menghantar mesej yang disulitkan kepada A. Walaupun ia dipintas oleh musuh, tiada bahaya , kerana hanya kunci peribadi A boleh menyahsulit mesej, menghalang kebocoran kandungan mesej.

**Senario kedua:** Selepas A menerima mesej daripada B, ia perlu membalas "diterima".

Proses tandatangan RSA adalah seperti berikut:

(1) A menghasilkan sepasang kunci (kunci awam dan kunci persendirian tidak didedahkan kepada umum dan disimpan oleh A dirinya sendiri. Kunci awam adalah awam dan boleh diperolehi oleh sesiapa sahaja.

(2) A menandatangani mesej dengan kunci peribadinya sendiri untuk membentuk tandatangan, dan menghantar mesej yang ditandatangani dan mesej itu sendiri kepada B.

(3) Selepas B menerima mesej, ia memperoleh kunci awam A untuk mengesahkan tandatangan Jika kandungan tandatangan itu konsisten dengan mesej itu sendiri, ia membuktikan bahawa mesej itu dibalas oleh A.

Dalam proses ini, hanya terdapat dua proses penghantaran Kali pertama ialah apabila A memindahkan mesej yang ditandatangani dan mesej itu sendiri kepada B. Kali kedua ialah apabila B memperoleh kunci awam A, walaupun ia dipintas. oleh musuh, dan tidak ada bahaya, kerana hanya kunci peribadi A boleh menandatangani mesej Walaupun kandungan mesej diketahui, ia tidak boleh memalsukan balasan yang ditandatangani kepada B, menghalang gangguan kandungan mesej.

Walau bagaimanapun, dengan menggabungkan dua senario, anda akan mendapati bahawa dalam senario pertama, walaupun mesej yang dipintas tidak bocor, kunci awam yang dipintas boleh digunakan untuk menyulitkan arahan palsu dan kemudian menyerahkannya kepada A. Dalam senario kedua, walaupun mesej yang dipintas tidak boleh diganggu, kandungan mesej boleh diperoleh menggunakan pengesahan tandatangan kunci awam, yang tidak menghalang kebocoran. Oleh itu, dalam aplikasi praktikal, ia harus digunakan mengikut situasi Penyulitan dan tandatangan juga boleh digunakan pada masa yang sama, contohnya, A dan B mempunyai set kunci awam dan peribadi mereka sendiri kepada B, dia mula-mula menggunakan pasangan kunci awam B Mesej disulitkan, dan kemudian kunci peribadi A digunakan untuk menandatangani mesej yang disulitkan, supaya ia tidak bocor atau diganggu, dan keselamatan mesej itu terjamin.

Penyulitan dalam tindakan

Blogger, anda telah banyak tweet, saya sudah tahu apa yang RSA lakukan. Bukankah hanya penyulitan kunci awam, penyahsulitan kunci persendirian, tandatangan kunci persendirian, pengesahan tandatangan kunci awam

Persediaan praktikal

1 Cipta springboot baharu projek

springboot_api_encryption

2. Perkenalkan maven Yilai

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

3. Tambahkan anotasi @EnableSecurity dalam Aplikasi kelas permulaan

@SpringBootApplication
@EnableSecurity
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

4. yml atau application.properties Tambah kunci awam dan kunci peribadi RSA dalam

Penjanaan kunci awam dan kunci peribadi akan dikeluarkan kemudian dalam artikel

rsa:
  encrypt:
    open: false # 是否开启加密 true  or  false
    showLog: true # 是否打印加解密log true  or  false
    publicKey: # RSA公钥 软件生成
    privateKey: # RSA私钥 软件生成

5 kaedah API dalam Pengawal

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

6. Nyahsulit parameter penyulitan yang diluluskan

Atur cara akhir java lain boleh menggunakan anotasi Jika ia adalah vue, sila gunakan kunci RSA untuk menyahsulit

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

Pedang dan senjata sebenar

1. Pengenalan ahli sihir

Bagaimana SpringBoot melaksanakan penyulitan api

2、启动类添加注解

Bagaimana SpringBoot melaksanakan penyulitan api

3、YML添加配置密钥

Bagaimana SpringBoot melaksanakan penyulitan api

4、创建一个实体类

Bagaimana SpringBoot melaksanakan penyulitan api

5、写一个对外API接口

Bagaimana SpringBoot melaksanakan penyulitan api

6、启动项目

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

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

Bagaimana SpringBoot melaksanakan penyulitan 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、加密日志

Bagaimana SpringBoot melaksanakan penyulitan 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添加解密方法接口

Bagaimana SpringBoot melaksanakan penyulitan 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

Bagaimana SpringBoot melaksanakan penyulitan api

4、后台解密日志

Bagaimana SpringBoot melaksanakan penyulitan 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();
}

Atas ialah kandungan terperinci Bagaimana SpringBoot melaksanakan penyulitan api. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam