ホームページ  >  記事  >  Java  >  SpringBoot が API 暗号化を実装する方法

SpringBoot が API 暗号化を実装する方法

WBOY
WBOY転載
2023-05-15 23:10:05825ブラウズ

SpringBoot の API 暗号化ドッキング

プロジェクトでは、データのセキュリティを確保するために、送信されるデータを暗号化することがよくあります。一般的に使用される暗号化アルゴリズムには、対称暗号化 (AES) と非対称暗号化 (RSA) があります。ブロガーは、次の説明のために Code Cloud 上の最も単純な API 暗号化プロジェクトを選択しました。

私たちの最も優れたプロジェクトを以下にリストしてください

rsa-encrypt-body-spring-boot

プロジェクトの紹介

このプロジェクトは RSA 暗号化方式を使用しています データを暗号化しますAPI データの安全性を高めるために API インターフェイスによって返されます。他の人は提供されたデータを解読できません。 Spring Boot インターフェイスの暗号化では、アノテーションを通じて戻り値とパラメーター値を自動的に暗号化および復号化できます。

RSA 暗号化とは

まず、もちろん RSA 暗号化について理解します。

RSA 暗号化は非対称暗号化です。復号化は、キーを直接渡さずに実行できます。これにより、情報のセキュリティが確保され、キーの直接送信によるクラッキングのリスクが回避されます。これは、それぞれ公開キーと秘密キーと呼ばれるキーのペアを使用した暗号化と復号化のプロセスです。この 2 つの間には数学的な相関関係があり、この暗号化アルゴリズムの原理は、セキュリティを確保するために非常に大きな整数を因数分解することが難しいことです。通常、個人は秘密鍵を保持し、公開鍵は公開されます (複数の人が同時に保持する場合があります)。

SpringBoot が API 暗号化を実装する方法

#たとえば、

暗号化と署名はどちらもセキュリティ上の理由から行われますが、若干異なります。暗号化と署名に秘密キーと公開キーのどちらを使用するかという質問がよくあります。実際、彼らは皆、暗号化と署名の役割について混乱しています。簡単に言うと、暗号化は情報の漏洩を防ぐことであり、署名は情報の改ざんを防ぐことです。以下に 2 つの例を示します。

最初のシーン: 戦場において、B は A にメッセージを送りたいと考えています。その内容はある指示です。

RSA の暗号化プロセスは次のとおりです:

(1) A は鍵のペア (公開鍵と秘密鍵) を生成します。秘密鍵は公開されず、A はそれを保持します。彼自身。公開キーは公開されており、誰でも取得できます。

(2) A はその公開キーを B に渡し、B は A の公開キーを使用してメッセージを暗号化します。

(3) A は、B によって暗号化されたメッセージを受信し、A 自身の秘密キーを使用してメッセージを復号化します。

このプロセスでは、送信プロセスは 2 回だけで、1 回目は A が B に公開鍵を送信し、2 回目は B が A に暗号化メッセージを送信します。 A の秘密鍵のみでメッセージを復号できるため、メッセージ内容の漏洩を防ぐことができるため、危険はありません。

**2 番目のシナリオ:**A は B からメッセージを受信した後、「受信しました」と応答する必要があります。

RSA 署名のプロセスは次のとおりです:

(1) A は鍵のペア (公開鍵と秘密鍵) を生成します。秘密鍵は公開されず、A はそれを保持します。彼自身。公開キーは公開されており、誰でも取得できます。

(2) A は、独自の秘密キーを使用してメッセージに署名して署名を形成し、署名されたメッセージとメッセージ自体を B に渡します。

(3) メッセージを受信した B は、A の公開鍵を取得して署名を検証し、署名の内容がメッセージ自体と一致していれば、メッセージが A から返信されたことを証明します。

このプロセスでは、送信プロセスは 2 つだけです。1 回目は、A が署名されたメッセージとメッセージ自体を B に転送するときです。2 回目は、たとえ傍受されたとしても、B が A の公開鍵を取得するときです。メッセージに署名できるのは A の秘密鍵だけであるため、危険はありません。メッセージの内容がわかっていても、B への署名付き返信を偽造することはできないため、メッセージの内容の改ざんを防ぐことができます。

ただし、2 つのシナリオを組み合わせると、最初のシナリオでは、傍受されたメッセージは漏洩しませんが、傍受された公開キーを使用して偽の指示を暗号化し、それを A に渡すことができることがわかります。 2 番目のシナリオでは、傍受されたメッセージを改ざんすることはできませんが、公開キー署名検証を使用してメッセージの内容を取得できますが、これでは漏洩は防止できません。したがって、実際のアプリケーションでは、状況に応じて使用する必要があります。暗号化と署名を同時に使用することもできます。たとえば、A と B はそれぞれ独自の公開鍵と秘密鍵のセットを持っています。A がメッセージを送信したい場合、 B に送信する場合、最初に B の公開鍵ペアを使用してメッセージが暗号化され、次に A の秘密鍵を使用して暗号化されたメッセージに署名することで、メッセージの漏洩や改ざんがなくなり、メッセージのセキュリティが確保されます。

暗号化の実践

ブロガーさん、あなたは Bilibili をよく使っているので、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. @EnableSecurity アノテーションをスタートアップ クラス Application

@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の紹介

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。