データのセキュリティを確保するために、フロントとリアのサイドAPIと対話する方法?(RPM)

序文

前と分離開発アプローチの終了後に、私たちのインターフェースは良いインターフェース定義を促進するための規格であり、それぞれが独自の機能を開発し、最終的には調整終値と。APPのWebアプリケーションやPC側のソフトウェアを開発またはネイティブかどうか、限り前と分離モードの後端部として、それはバックエンドのビジネス相互作用に提供されるコール・インタフェースを避けることができません。

Webページやアプリは、単にパッケージは、データを取得するためにこの要求を明確に認識することができつかんで、爬虫類エンジニアのためのそのようなインタフェースは、ちょうどあなたのデータを簡単にキャッチし、祝福です。

データセキュリティは、ユーザーに関連する特に情報、非常に重要であり、わずかなミスが犯罪者に乗っ取られますので、我々はこれに大きな重要性を添付しなければならない、ずさんな容認することはできません。

APIのコールデータの安全性を確保するには?

  1. 通信使用https

  2. 改竄パラメータを防止する、署名を求めます

  3. 識別機構は、各要求が合法性を確認する必要があります

  4. APPは、キャプチャ操作のSSLピニングを防ぐために使用されます

  5. すべての暗号化と復号化操作のための要求と応答

  6. そしてそうで......プログラム。

すべての暗号化と復号化操作のための要求と応答

多くのプログラムは、私が呼び出すことができる場合でも、我々はキャプチャすることができた場合でも、プログラムの両方の暗号化と復号化の操作のためのすべての要求と応答を紹介しますとより高いセキュリティ、私は今日を意味し、あなたがより多くを行う際に、ありますインターフェースが、私は暗号化されたデータを返され、暗号化アルゴリズムは限り十分に確保され、あなたは私の暗号化されたコンテンツは、私には影響しませんです。

統一されたプロセスを作るために最善のこの作品のように、あなたがこの問題に注意を払うために、各開発者は非常に面倒である場合になるように各開発のGoは、この問題を懸念している任せることはできない、暗号手動コール・リターン・データを持っていましたデータは、呼び出し元のメソッドで受信される方法は、復号化を持っています。

このような理由から、私は春ブーツ内蔵のAES暗号化アルゴリズムスターターを、カプセル化に基づきます。次のアドレスでGitHubの:

https://github.com/yinjihuan/spring-boot-starter-encrypt

あなたは、その後導入することができ、ソースコードをダウンロードして、ブートオープンクラスの暗号化と復号化の操作に@EnableEncryptコメントを増やすことができます、の使い方を見てみましょう:

@EnableEncrypt 
@SpringBootApplication 
パブリッククラスアプリ{ 
    パブリック静的無効メイン(文字列[] args){ 
        SpringApplication.run(App.class、引数)。
    } 
}

暗号化キーの設定を追加します。

spring.encrypt.key = abcdef0123456789 
spring.encrypt.debug =偽
  • spring.encrypt.key:暗号化キー、16でなければなりません

  • spring.encrypt.debug:デバッグモードを開くかどうかを暗号化と復号化の操作を有効になっていない場合はtrue、デフォルトでは、falseです

ユニバーサルとみなされるためには、それはすべての要求のための暗号化と復号化を実行しません、注釈ベースの制御を行います

応答データは@Encrypt注釈を追加する方法では、コントローラを暗号化します。

@Encrypt 
@GetMapping( "/リスト")
のパブリック応答queryNews(文字列市){ 
    Response.ok(都市)を返します。
}

私たちは/リストにアクセスすると、返されるデータのインターフェース・フォーマットは、暗号化した後、base64エンコードです。

前項の規定により提出した別の運用データは、背景を言うことである2例、1が要求を取得され、この時間は何も取引されていない、後で検討し、POSTリクエストは現在処理のみ、提出ベースのJSON形式、分割され仕事のためにデータを受信する必要が@RequestBody、我々はコメントを操作プラス@Decryptを復号化する必要があります。

@Decrypt 
@PostMapping( "/保存")
公衆応答savePageLog(@RequestBody PageLogParam logParam、HttpServletRequestのリクエスト){ 
    pageLogService.save(logParam)。
    Response.okを返します(); 
}

@Decryptは、AES暗号アルゴリズムに従った送信データのフロントエンドは、暗号化されている必要があり、その後、後端に提出され、後端側が自動的に復号化され、次いで、パラメータオブジェクトにマッピングされ、注釈を追加しました。

前述したが、我々が説明する前JSを使用している場合、それはネイティブのAndroidアプリはJavaコードを処理するために使用されている場合は、もちろん、あなたも、行うには他の言語を使用することができ、バックエンドのコードです。

フロントエンドは2つのことに行われる必要があります:

  1. 統一された治療応答データ、ページをレンダリングする前に作業を解読

  2. POST要求データが送信されると、統一された暗号化

JSファイルの暗号化は、暗号化で私のGitHubにaes.js、暗号js.js、パッドzeropadding.jsを参照してください。

私たちは、一体にaxiosインターセプタの暗号化と復号化の操作で、要求データフレームとしてaxios

次のようにすべてのJS、クラスの暗号化と復号化をパッケージ化するために、あるいは相互に暗号化の鍵と背景のニーズを復号化することができないことに留意されたいです。

VARキー= CryptoJS.enc.Latin1.parse( 'abcdef0123456789'); 
VaRのIV = CryptoJS.enc.Latin1.parse( 'abcdef0123456789'); 
//加密
関数EncryptData(データ){ 
    VAR SRCS = CryptoJS.enc.Utf8.parse(データ)。
    VAR暗号化= CryptoJS.AES.encrypt(SRCS、キー、{ 
        モード:CryptoJS.mode.ECB、
        パディング:CryptoJS.pad.Pkcs7 
    })。
    )(encrypted.toStringを返します。
} 
//解密
関数DecryptData(データ){ 
    VARのSTIME =新しいDate()getTime()。
    VaRの解読= CryptoJS.AES.decrypt(データ、キー、{ 
        モード:CryptoJS.mode.ECB、
        パディング:CryptoJS.pad.Pkcs7 
    })。
    VaRの結果= JSON.parse(CryptoJS.enc.Utf8.stringify(解読).toString()); 
    。VARのETIME =新しいDate()getTime(); 
    console.log( "DecryptData時間:" +(ETIME - STIME)); 
    結果を返します。
}

axiosインターセプタ統一処理コード:

//リクエストインターセプタの追加
axios.interceptors.request.use(機能(設定){ 
    すべてのPOSTの暗号化のための//セットアップを、JSONデータを提出しなければならない形式をサポートしていません
    (config.methodが==「POST」){IF 
        設定。 EncryptData =データ(JSON.stringify(config.data)); 
    } 
    戻り値の設定; 
  }関数(誤差){ 
    Promise.reject(エラー)を返す; 
}); 
//応答ブロッカー追加
axios.interceptors.response.useを(関数(応答){ 
    //必要な復号操作の後端の文字列表現を返し
    た場合(typeof演算(response.dataを)== "文字列"){ 
        response.data = DecryptData(response.data); 
    } 
    戻り応答; 
  }関数(エラー){ 
    Promise.reject(エラー)を返します; 
});

これまでのところ、我々は他の人があなたのデータは役に立たない取得するには、限り、暗号鍵が漏洩しないよう暗号化操作の相互作用の終了前と後の全体の通信のために行う、質問はそのキーを確実にする方法であることを漏洩しませんか?

高いセキュリティサーバは、フロントエンドは、アプリは幸い、パッケージ化することができたときに実際には最も危険な、私たち自身のサーバー上で、すべての後に、データベースまたはコンフィギュレーションファイルに保存することができますが、そうで逆コンパイルを防止します。

あなたはJSを達成するために、暗号化に頼ることができるWebアプリケーションならば、今私は、動的暗号化キーのやり方を紹介してもらうが、実装がより複雑に、私たちはコードにない、私たちはアイデアについて話します:

暗号化アルゴリズム、対称暗号化と非対称暗号化、AESは、対称暗号化、RSA-非対称暗号化です。RSAが遅い実行されている、なぜなら高効率のデータのAES暗号化を使用する理由は、署名操作のために使用することができます。

我々は、データを暗号化するためにAESを使用して送信AES秘密鍵、両方の組み合わせ、補完的な利点にRSA暗号化を使用しての安全性を確保するために、これらの2つの相補的なアルゴリズムを使用することができます。

あなたは、クライアントとサーバーが安全に遅いHTTPの理由よりも、対称暗号化アルゴリズムを交渉したいので、実際には、我々は、HTTPSの原理を理解し、次のコンテンツを理解するための1、HTTPSでなければなりません。残りは通信当事者は、暗号化および復号化のために、この対称暗号化アルゴリズムを使用しています。

  1. クライアントは、起動するサーバに要求を送信し、サーバはRSAアルゴリズムを使用して、公開鍵と秘密鍵のペアを生成し、我々はprikey1、pubkey1と呼ばれる、公開鍵pubkey1は、クライアントに返されます。

  2. 公共pubkey1を取得するために、クライアントがサーバから返された後、公開鍵と秘密鍵を使用して、独自のRSAアルゴリズムを生成し、我々は、サーバーへの暗号化送信後、pubkey2、prikey2、およびパブリックpubkey2公開鍵暗号pubkey1と呼ば。

  3. このとき、サーバはデータが公開鍵pubkey1で暗号化されているので、クライアントが生成した公開鍵pubkey2を復号化することによって得ることができる、prikey1を復号化するための秘密鍵を使用して、クライアントから送信された暗号文を受け取り、

  4. その後で、自分自身たちのAESである対称暗号化を生成するための後、実際には、我々は、鍵は公開鍵pubkey2で暗号化されている私たちは16に設定された暗号鍵の長さに比べて、生成されたクライアントに返さ、なぜならクライアントだけが対応する秘密鍵prikey2のpubkey2を持っている、唯一のクライアントはこれまでのところ、データを取得するには、クライアントの後、解読prikey2での動作を解読、キーのAES暗号化を取得し、最終的に暗号化キーを使用してデータ伝送を暗号化し、全体のプロセスの終了することができます。

春・ブート・スタータ暗号化原理

最後に、私たちはバーの下に導入されたバネのブート・スターター・暗号化の単純な原理に来るが、また、なぜ春ブーツがそう簡単に私たちが理解できるように、単純な構成をクリックすると、機能の多くを達成することができます。

クラスの@EnableEncrypt注釈は@importベースの自動設定を導入することで機能を有効にするために開始され

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented 
@Inherited 
@import({EncryptAutoConfiguration.class})
パブリック@interface EnableEncrypt { 
}

EncryptAutoConfigurationクラス設定要求と応答処理、スプリングを使用してRequestBodyAdvice ResponseBodyAdviceは、要求の統計処理は、春に便利です。あなたはより多くを持っている場合は作品を処理するために、基礎となるサーブレットから、それをパッケージ化します。

@Configuration 
@Component 
@EnableAutoConfiguration 
@EnableConfigurationProperties(EncryptProperties.class)
パブリッククラスEncryptAutoConfiguration { 
    / ** 
     *配置请求解密
     * @return 
     * / 
    @Bean 
    公共EncryptResponseBodyAdvice encryptResponseBodyAdvice(){ 
        )(新しいEncryptResponseBodyAdviceを返します。
    } 
    / ** 
     *配置请求加密
     * @return 
     * / 
    @Bean 
    公共EncryptRequestBodyAdvice encryptRequestBodyAdvice(){ 
        )(新しいEncryptRequestBodyAdviceを返します。
    } 
}

RequestBodyAdviceとResponseBodyAdviceすることにより、要求に応じた処理を行う、との原則は、おそらくそんなにあることができます。

おすすめ

転載: www.cnblogs.com/fifteen-wu/p/11080166.html