SpringBoot の API 暗号化ドッキング
プロジェクトでは、データのセキュリティを確保するために、送信されるデータを暗号化することがよくあります。一般的に使用される暗号化アルゴリズムには、対称暗号化 (AES) と非対称暗号化 (RSA) があります。ブロガーは、次の説明のために Code Cloud 上の最も単純な API 暗号化プロジェクトを選択しました。
私たちの最も優れたプロジェクトを以下にリストしてください
rsa-encrypt-body-spring-boot
プロジェクトの紹介
このプロジェクトは RSA 暗号化方式を使用しています データを暗号化しますAPI データの安全性を高めるために API インターフェイスによって返されます。他の人は提供されたデータを解読できません。 Spring Boot インターフェイスの暗号化では、アノテーションを通じて戻り値とパラメーター値を自動的に暗号化および復号化できます。
RSA 暗号化とは
まず、もちろん RSA 暗号化について理解します。
RSA 暗号化は非対称暗号化です。復号化は、キーを直接渡さずに実行できます。これにより、情報のセキュリティが確保され、キーの直接送信によるクラッキングのリスクが回避されます。これは、それぞれ公開キーと秘密キーと呼ばれるキーのペアを使用した暗号化と復号化のプロセスです。この 2 つの間には数学的な相関関係があり、この暗号化アルゴリズムの原理は、セキュリティを確保するために非常に大きな整数を因数分解することが難しいことです。通常、個人は秘密鍵を保持し、公開鍵は公開されます (複数の人が同時に保持する場合があります)。
#たとえば、暗号化と署名はどちらもセキュリティ上の理由から行われますが、若干異なります。暗号化と署名に秘密キーと公開キーのどちらを使用するかという質問がよくあります。実際、彼らは皆、暗号化と署名の役割について混乱しています。簡単に言うと、暗号化は情報の漏洩を防ぐことであり、署名は情報の改ざんを防ぐことです。以下に 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_encryption2. 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 公開キーと秘密キーを
に追加します。公開キーと秘密キーの生成に関する記事では、生成ツール5 がリリースされます。コントローラの API メソッドrsa: encrypt: open: false # 是否开启加密 true or false showLog: true # 是否打印加解密log true or false publicKey: # RSA公钥 软件生成 privateKey: # RSA私钥 软件生成
@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、启动类添加注解
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(); }
以上がSpringBoot が API 暗号化を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター
