ホームページ バックエンド開発 PHPチュートリアル Laravel での暗号化および復号化実装メソッドの共有例

Laravel での暗号化および復号化実装メソッドの共有例

Jan 10, 2018 pm 04:57 PM
decrypt encrypt laravel

この記事では、Laravel での暗号化と復号化の実装方法を、サンプル コードを通じて詳しく紹介します。必要な方は、このエディターを参照してください。そして勉強。

前書き

Laravel の暗号化メカニズムは OpenSSL を使用して AES-256 および AES-128 暗号化を提供します。この記事では、Laravel での暗号化と復号化の実装について詳しく紹介し、参考と学習のために共有します。以下で詳細を見てみましょう。

1. 使い方

まず秘密鍵を生成します。 .env ディレクトリに APP_KEY を指定する必要があります。これが利用できない場合は、phpArtisan key:generate コマンドを使用して生成するか、自分で設定できます。生成された例は次のようになります

APP_KEY=base64:5BM1BXGOBrGeeqJMAWJZSzyzh5yPcCGOcOGPtUij65g=
ログイン後にコピー

ファイルに暗号化キーと暗号化アルゴリズムを設定します

$ 'key' => env('APP_KEY'),
 
  'cipher' => 'AES-256-CBC',
ログイン後にコピー

使用方法はすでにあります。 laravelではあまり多くのことは言えません。使用される主な方法は、encrypt による暗号化と decrypt による復号化です。は EncryptionServiceProvider、もう 1 つは Encrypter

3. EncryptionServiceProvider ファイルを分析します

 public function register()
 {
  $this->app->singleton('encrypter', function ($app) {
   $config = $app->make('config')->get('app'); //从config/app.php里拿到配置文件

   if (Str::startsWith($key = $config['key'], 'base64:')) { //分析配置文件里的key里面有没有带'base64'
    $key = base64_decode(substr($key, 7)); //如果有的话,把key前面的base64:给取消,并且解析出原来的字符串
   }

   return new Encrypter($key, $config['cipher']); //实例化Encrypte类,注入到框架里
  });
 }
ログイン後にコピー
このファイルには多くの内容はありませんが、このことから、実際には設定ファイルにキーを直接書き込むことができることがわかります。前にbase64がなくても解析できます。これは、いくつかの手順を節約することに相当します

さらに、クラスをインスタンス化するときに、キーと暗号化メソッドを渡す必要があります

4. Encrypter ファイルを分析します

1. インスタンス化する前に __construct を分析して実行します

 public function __construct($key, $cipher = 'AES-128-CBC')
 {
  $key = (string) $key; //把key转换为字符串

  if (static::supported($key, $cipher)) { //调用一个自定义的方法,用来判断加密方式和要求的key长度是否一样
   $this->key = $key;
   $this->cipher = $cipher;
  } else {
   throw new RuntimeException('The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths.');
  }
 }
ログイン後にコピー
この方法は主に、暗号化方式と送信されたキーの長さが同じかどうかを判断するために使用されます。これは、暗号化方式が異なれば、対応するキーの長さも必要になるためです。具体的には、各暗号化方式で必要なキーの長さが異なります。

 public static function supported($key, $cipher)
 {
  $length = mb_strlen($key, '8bit'); //判断key的字符的长度,按照8bit位的方式计算字符长度

  return ($cipher === 'AES-128-CBC' && $length === 16) ||
    ($cipher === 'AES-256-CBC' && $length === 32); //编码格式为AES128的要求字符长度为16。编码格式为AES256的要求字符长度为32位
 }
ログイン後にコピー
上記の方法は、mb_strlen メソッドを使用し、8 ビットに基づいて計算長を計算する必要がある厳密な点を示しています。この利点は、どのオペレーティング システム上であっても、計算の長さが同じであることです。

さまざまなオペレーティング システムの条件を考慮することで、暗号化の問題は発生しません。

2. encrypt メソッドを分析する

 public function encrypt($value, $serialize = true)
 {
  $iv = random_bytes(16); //生成一个16位的随机字符串
  
  
  // 使用openssl_encrypt把数据生成一个加密的数据
  // 1、判断需要不需要生成一个可存储表示的值,这样做是为了不管你的数据是数组还是字符串都能给你转成一个字符串,不至于在判断你传过来的数据是数组还是字符串了。
  // 2、使用openssl_encrypt。第一个参数是传入数据,第二个参数是传入加密方式,目前使用AES-256-CBC的加密方式,第三个参数是,返回加密后的原始数据,还是把加密的数据在经过一次base64的编码,0的话表示base64位数据。第四个参数是项量,这个参数传入随机数,是为了在加密数据的时候每次的加密数据都不一样。
  $value = \openssl_encrypt(
   $serialize ? serialize($value) : $value,
   $this->cipher, $this->key, 0, $iv
  ); //使用AES256加密内容

  if ($value === false) {
   throw new EncryptException('Could not encrypt the data.');
  }

  $mac = $this->hash($iv = base64_encode($iv), $value); //生成一个签名,用来保证内容参数没有被更改

  $json = json_encode(compact('iv', 'value', 'mac')); //把随机码,加密内容,已经签名,组成数组,并转成json格式

  if (! is_string($json)) {
   throw new EncryptException('Could not encrypt the data.');
  }

  return base64_encode($json); //把json格式转换为base64位,用于传输
 }
ログイン後にコピー
カスタム メソッド hash() が使用されているので、メソッドの実装を見てみましょう。

 protected function hash($iv, $value)
 {
  // 生成签名
  // 1、把随机值转为base64
  // 2、使用hash_hmac生成sha256的加密值,用来验证参数是否更改。第一个参数表示加密方式,目前是使用sha256,第二个是用随机值连上加密过后的内容进行,第三个参数是上步使用的key。生成签名。
  return hash_hmac('sha256', $iv.$value, $this->key); /根据随机值和内容,生成一个sha256的签名
 }
ログイン後にコピー
上記の暗号化は 3 つの主要なステップに分かれています

1. ランダム コードの生成

2. 暗号化されたコンテンツの生成 3. 署名の生成

フレームワークは、シリアル化を使用して値を生成するエレガントなメソッドを使用します。このメソッドの特徴は、コンテンツが配列であるか文字列であるかに関係なく、文字列に変換できることです。 Serialize を使用することと json_encode を使用することの違いは何ですか? 最大の利点は、暗号化するコンテンツが比較的大きい場合、serialize の方が比較的高速であることだと思います。

もう 1 つは、フレームワークが暗号化するときにランダムな文字列を使用することです。ランダムな文字列を使用する理由 ランダムな文字列が使用されるため、暗号化されたコンテンツは他人に推測されるのを防ぐために毎回異なります。

3. 復号化方法の分析

データの復号化は、データを復号化するだけでなく、データの整合性を確保し、改ざんを防止する必要があるため、最も複雑な部分と言えます。

getJsonPayload メソッド

public function decrypt($payload, $unserialize = true)
 {
  $payload = $this->getJsonPayload($payload); //把加密后的字符串转换出成数组。

  $iv = base64_decode($payload['iv']); //把随机字符串进行base64解密出来

  $decrypted = \openssl_decrypt( //解密数据
   $payload['value'], $this->cipher, $this->key, 0, $iv
  );

  if ($decrypted === false) {
   throw new DecryptException('Could not decrypt the data.');
  }

  return $unserialize ? unserialize($decrypted) : $decrypted; //把数据转换为原始数据
 }
ログイン後にコピー
validPayload メソッド 詳細は説明しませんが、データが改ざんされていないことを確認するための validMac の検証に重点が置かれています。これが最も重要です。元のデータとランダムな値に基づいて署名を生成し、これを使用します 署名によって再度署名が生成されます

 protected function getJsonPayload($payload)
 {
  $payload = json_decode(base64_decode($payload), true); //把数据转换为原来的数组形式

  if (! $this->validPayload($payload)) { //验证是不是数组以及数组里有没有随机字符串,加密后的内容,签名
   throw new DecryptException('The payload is invalid.');
  }

  if (! $this->validMac($payload)) { //验证数据是否被篡改
   throw new DecryptException('The MAC is invalid.');
  }

  return $payload;
 }
ログイン後にコピー
上記の復号化は、大きく 3 つのステップに分かれています

1. データの整合性を判断します

2.データの整合性を確認します

3. データの内容を復号化します。

この検証署名には、通常の署名検証とは異なります。通常、元のデータとランダムな値を使用して署名を検証し、署名を生成し、生成された署名を元のデータの署名と比較して改ざんされているかどうかを判断します。

しかし、彼が使用しているのは、元のデータとランダムな値を通じて署名を生成し、この署名を使用して署名を生成し、比較でも元のデータの署名を使用することです。署名を生成して比較します。なぜさらにいくつかの手順が必要なのかわかりません。

暗号化中に、serialize を使用して元のデータを変換したため、それに応じてデータを逆変換するために unserialize も使用する必要があります。


暗号化に使用される openssl_encrypt のランダム項目値は、使用された元のデータ生のバイナリ値であり、openssl_decrypt を使用して復号化された値は、base64 ビットが使用された後のランダム文字列です。

  • 復号化時に比較用の署名を生成する場合、元の署名を使用し、比較用に元のデータの内容に基づいて署名を再生成するのではなく、元の署名をベースとして署名を生成し、生成された署名は、この新しく生成された署名を使用して再生成されます。次に比較します。

  • AES256 は暗号化されたデータであり、後で逆に復号化することができます。 SHA256 は署名を生成します。このプロセスは元に戻すことができず、データの整合性を検証するために使用されます。

  • 関連する推奨事項:

    AES_ENCRYPT() と AES_DECRYPT() を正しく使用して MySQL を暗号化および復号化する方法

    laravel 5.1 使用時の「サポートされている暗号化ツールが見つかりません」エラーの解決策

    javascript - ミニ プログラムwx.getUserInfo

    のencryptDataの復号化

    以上がLaravel での暗号化および復号化実装メソッドの共有例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

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

    AI Clothes Remover

    AI Clothes Remover

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

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

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

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

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

    Laravel と CodeIgniter の最新バージョンの比較 Laravel と CodeIgniter の最新バージョンの比較 Jun 05, 2024 pm 05:29 PM

    Laravel 9 と CodeIgniter 4 の最新バージョンでは、更新された機能と改善が提供されます。 Laravel9はMVCアーキテクチャを採用しており、データベース移行、認証、テンプレートエンジンなどの機能を提供します。 CodeIgniter4 は、HMVC アーキテクチャを使用してルーティング、ORM、およびキャッシュを提供します。パフォーマンスの面では、Laravel9 のサービスプロバイダーベースの設計パターンと CodeIgniter4 の軽量フレームワークにより、優れたパフォーマンスが得られます。実際のアプリケーションでは、Laravel9 は柔軟性と強力な機能を必要とする複雑なプロジェクトに適しており、CodeIgniter4 は迅速な開発や小規模なアプリケーションに適しています。

    Laravel と CodeIgniter のデータ処理機能はどのように比較されますか? Laravel と CodeIgniter のデータ処理機能はどのように比較されますか? Jun 01, 2024 pm 01:34 PM

    Laravel と CodeIgniter のデータ処理機能を比較します。 ORM: Laravel はクラスとオブジェクトのリレーショナル マッピングを提供する EloquentORM を使用しますが、CodeIgniter は ActiveRecord を使用してデータベース モデルを PHP クラスのサブクラスとして表します。クエリビルダー: Laravel には柔軟なチェーンクエリ API がありますが、CodeIgniter のクエリビルダーはよりシンプルで配列ベースです。データ検証: Laravel はカスタム検証ルールをサポートする Validator クラスを提供しますが、CodeIgniter には組み込みの検証関数が少なく、カスタム ルールの手動コーディングが必要です。実践例:ユーザー登録例はLarを示しています

    Laravel と CodeIgniter ではどちらが初心者に優しいでしょうか? Laravel と CodeIgniter ではどちらが初心者に優しいでしょうか? Jun 05, 2024 pm 07:50 PM

    初心者にとって、CodeIgniter は学習曲線が緩やかで機能は少ないですが、基本的なニーズはカバーしています。 Laravel は幅広い機能セットを提供しますが、学習曲線はわずかに急になります。パフォーマンスの点では、Laravel と CodeIgniter はどちらも良好なパフォーマンスを示します。 Laravel にはより広範なドキュメントとアクティブなコミュニティ サポートがあり、CodeIgniter はよりシンプルで軽量で、強力なセキュリティ機能を備えています。ブログアプリケーションを構築する実際のケースでは、Laravel の EloquentORM を使用するとデータ操作が簡素化されますが、CodeIgniter ではより手動の構成が必要になります。

    Laravel と CodeIgniter: 大規模プロジェクトにはどちらのフレームワークが適していますか? Laravel と CodeIgniter: 大規模プロジェクトにはどちらのフレームワークが適していますか? Jun 04, 2024 am 09:09 AM

    大規模プロジェクト用のフレームワークを選択する場合、Laravel と CodeIgniter にはそれぞれ独自の利点があります。 Laravel はエンタープライズレベルのアプリケーション向けに設計されており、モジュール設計、依存関係の注入、強力な機能セットを提供します。 CodeIgniter は、速度と使いやすさを重視した、小規模から中規模のプロジェクトに適した軽量フレームワークです。複雑な要件と多数のユーザーを伴う大規模なプロジェクトには、Laravel のパワーとスケーラビリティがより適しています。単純なプロジェクトやリソースが限られている状況では、CodeIgniter の軽量で迅速な開発機能がより理想的です。

    Laravel - アーティザンコマンド Laravel - アーティザンコマンド Aug 27, 2024 am 10:51 AM

    Laravel - アーティザン コマンド - Laravel 5.7 には、新しいコマンドを処理およびテストするための新しい方法が付属しています。これには職人コマンドをテストする新しい機能が含まれており、そのデモについては以下で説明します。

    Laravel と CodeIgniter: 小規模プロジェクトにはどちらのフレームワークが適していますか? Laravel と CodeIgniter: 小規模プロジェクトにはどちらのフレームワークが適していますか? Jun 04, 2024 pm 05:29 PM

    小規模なプロジェクトの場合、Laravel は強力な機能とセキュリティを必要とする大規模なプロジェクトに適しています。 CodeIgniter は、軽量さと使いやすさを必要とする非常に小規模なプロジェクトに適しています。

    Laravel と CodeIgniter ではどちらのテンプレート エンジンが優れていますか? Laravel と CodeIgniter ではどちらのテンプレート エンジンが優れていますか? Jun 03, 2024 am 11:30 AM

    Laravel の Blade と CodeIgniter の Twig テンプレート エンジンを比較し、プロジェクトのニーズと個人的な好みに基づいて選択してください。Blade は MVC 構文に基づいており、適切なコード編成とテンプレートの継承を促進します。 Twig は、柔軟な構文、強力なフィルター、拡張サポート、セキュリティ サンドボックスを提供するサードパーティ ライブラリです。

    Laravel - アーティザン コンソール Laravel - アーティザン コンソール Aug 27, 2024 am 10:51 AM

    Laravel - Artisan Console - Laravel フレームワークは、コマンドラインを介した対話のための 3 つの主要なツール、つまり Artisan、Ticker、REPL を提供します。この章ではArtisanについて詳しく説明します。

    See all articles