yii2 暗号化と復号化の概要
この記事では、yii2 暗号化と復号化の入門を中心に紹介しますが、ある程度の参考価値があるので、皆さんに共有します。必要な友人は参考にしてください。
関連環境
オペレーティング システムと IDE macOS 10.13.1 & PhpStorm2018.1.2
ソフトウェア バージョン PHP7.1.8 Yii2.0.14
yii2 では暗号化と復号化を管理するライブラリは Security と呼ばれ、yii2 コンポーネントとして存在するため、Yii::$app->security を通じて取得して使用できます。
セキュリティ コンポーネントのソース コードの場所は次のとおりです
vendor/yiisoft/yii2/base/Security.php
セキュリティ コンポーネントには、暗号化と復号化 (&エンコーディング) に関連するパブリック メソッドが合計 15 個あります。まずリストを作成しましょう。
- ##encryptByPassword
- encryptByKey ##decryptByPassword
- decryptByKey
- hkdf
- pbkdf2
- hashData
-
- generateRandomKey
- generateRandomString
- generatePasswordHash
- validatePassword ##compareString
- ##maskToken
- unmaskToken
- 見たことのないものもあるかと思いますが、構いませんので、一つずつ学んでいきましょう。
- generateRandomString最初に generateRandomString
public function generateRandomString($length = 32){...}
generatePasswordHash & validatePassword は、ユーザーのパスワードを暗号化し、パスワードが正しいかどうかを確認するためによく使用されます。MD5 は衝突する可能性があるため、yii2 を使用してアプリケーションを開発する場合は、generatePasswordHash 関数を使用します。パスワードの暗号化が最初の選択肢となり、crypt 関数が呼び出されます。
一般的な使用法は次のとおりです。// 使用generatePasswordHash为用户的密码加密,$hash存储到库中 $hash = Yii::$app->getSecurity()->generatePasswordHash($password); // 使用validatePassword对密码进行验证 if(Yii::$app->getSecurity()->validatePassword($password, $hash)){ // 密码正确 }else{ // 密码错误 }
generateRandomString
と似ており、ランダムな文字列を生成します。パラメータは長さで、デフォルトは32 ビット、違いはgenerateRandomKey
生成されたものは ASCII ではありません。 単純に言えば、generateRandomString は、base64_encode(generateRandomKey) とほぼ同じです。
encryptByPassword & decryptByPasswordエンコード関数とデコード関数は、秘密キーを使用してデータをエンコードし、この秘密キーを使用してエンコードされたデータをデコードします。 例
$dat = Yii::$app->security->encryptByPassword("hello","3166886"); echo Yii::$app->security->encryptByPassword($dat,"3166886");// hello
上記で取得したエンコードされたデータはASCIIではなく、base64_encodeおよびbase64_decodeを通じて外側の層にラップできることに注意してください。
encryptByKey & decryptByKey もエンコードおよびデコード関数のセットであり、パスワードを使用するよりも高速です。関数宣言はpublic function encryptByKey($data, $inputKey, $info = null){} public function decryptByKey($data, $inputKey, $info = null){}
標準の HKDF アルゴリズムを使用して、指定された入力キーからキーを派生します。
hash_hkdf メソッドは PHP7 で使用され、hash_hmac メソッドは PHP7 で使用されます。 pbkdf2 標準の PBKDF2 アルゴリズムを使用して、指定されたパスワードからキーを導出します。この方法はパスワード暗号化に使用できますが、yii2 にはより優れたパスワード暗号化ソリューションgeneratePasswordHash があります。
hashData と validateData コンテンツの改ざんを防ぐために、データにマークを付ける必要がある場合があります。このタスクを完了するには、HashData と validateData を組み合わせます。hashData
は、次のコードのように、元のデータにデータ プレフィックス
を追加するために使用されます。$result = Yii::$app->security->hashData("hello",'123456',false); // ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhello
注: hashData の 3 番目のパラメータは、生成されたハッシュ値が元のバイナリ形式であるかどうかを表します。false の場合は、小文字の 16 進数が生成されます。
validateData
次のコードに示すように、データ プレフィックスが追加されたデータを検出します。$result = Yii::$app->security->validateData("ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhello",'123456',false); // hello
元の文字列が返された場合は検証に合格したことを意味し、それ以外の場合は false を返します。 。
validateData 関数の 3 番目のパラメーターは、hashData() を使用してデータが生成されたときと同じ値である必要があり、データ内のハッシュ値がバイナリ形式であるかどうかを示します。 false
は、ハッシュ値が小文字の 16 進数のみで構成されていることを意味します。16 進数が生成されます。compareStringタイミング攻撃を防ぐ文字列比較。使用方法は非常に簡単です。 。
Yii::$app->security->compareString("abc",'abc');
結果が true の場合は等しくなりますが、それ以外の場合は等しくありません。
それでは、タイミング攻撃とは何でしょうか?簡単な例を挙げてみましょう。 if($code == Yii::$app->request->get('code')){
}
ログイン後にコピー
上記の比較ロジックでは、2つの文字列を先頭ビットから1つずつ比較し、相違があれば即座にfalseを返し、その戻り速度を計算することでどちらが分かるかがわかります。ビットが異なるようになり、映画でよく登場するビットごとのパスワード解析シーンを実現します。
if($code == Yii::$app->request->get('code')){ }
而使用 compareString 比较两个字符串,无论字符串是否相等,函数的时间消耗是恒定的,这样可以有效的防止时序攻击。
maskToken && unmaskToken
maskToken用于掩盖真实token且不可以压缩,同一个token最后生成了不同的随机令牌,在yii2的csrf功能上就使用了maskToken,原理并不复杂,我们看下源码。
public function maskToken($token){ $mask = $this->generateRandomKey(StringHelper::byteLength($token)); return StringHelper::base64UrlEncode($mask . ($mask ^ $token)); }
而unmaskToken目的也很明确,用于得到被maskToken掩盖的token。
接下来我们看一个例子代码
$token = Yii::$app->security->maskToken("123456"); echo Yii::$app->security->unmaskToken($token);// 结果为 123456
最后我们总结下
加密/解密: encryptByKey()、decryptByKey()、 encryptByPassword() 和 decryptByPassword();
使用标准算法的密钥推导: pbkdf2() 和 hkdf();
防止数据篡改: hashData() 和 validateData();
密码验证: generatePasswordHash() 和 validatePassword()
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上がyii2 暗号化と復号化の概要の詳細内容です。詳細については、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)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
