この記事では、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 個あります。まずリストを作成しましょう。
validateData
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
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')){ }
而使用 compareString 比较两个字符串,无论字符串是否相等,函数的时间消耗是恒定的,这样可以有效的防止时序攻击。
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 サイトの他の関連記事を参照してください。