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
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类,注入到框架里 }); }
さらに、クラスをインスタンス化するときに、キーと暗号化メソッドを渡す必要があります
4. Encrypter ファイルを分析します
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位 }
さまざまなオペレーティング システムの条件を考慮することで、暗号化の問題は発生しません。
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位,用于传输 }
protected function hash($iv, $value) { // 生成签名 // 1、把随机值转为base64 // 2、使用hash_hmac生成sha256的加密值,用来验证参数是否更改。第一个参数表示加密方式,目前是使用sha256,第二个是用随机值连上加密过后的内容进行,第三个参数是上步使用的key。生成签名。 return hash_hmac('sha256', $iv.$value, $this->key); /根据随机值和内容,生成一个sha256的签名 }
2. 暗号化されたコンテンツの生成 3. 署名の生成
フレームワークは、シリアル化を使用して値を生成するエレガントなメソッドを使用します。このメソッドの特徴は、コンテンツが配列であるか文字列であるかに関係なく、文字列に変換できることです。 Serialize を使用することと json_encode を使用することの違いは何ですか? 最大の利点は、暗号化するコンテンツが比較的大きい場合、serialize の方が比較的高速であることだと思います。
もう 1 つは、フレームワークが暗号化するときにランダムな文字列を使用することです。ランダムな文字列を使用する理由 ランダムな文字列が使用されるため、暗号化されたコンテンツは他人に推測されるのを防ぐために毎回異なります。
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; //把数据转换为原始数据 }
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; }
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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

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

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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