ホームページ  >  記事  >  バックエンド開発  >  yii2 暗号化と復号化の概要

yii2 暗号化と復号化の概要

不言
不言オリジナル
2018-07-10 15:14:542066ブラウズ

この記事では、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 個あります。まずリストを作成しましょう。

  1. ##encryptByPassword

  2. encryptByKey

  3. ##decryptByPassword
  4. decryptByKey
  5. hkdf
  6. pbkdf2
  7. hashData
  8. validateData
  9. generateRandomKey
  10. generateRandomString
  11. generatePasswordHash
  12. validatePassword

  13. ##compareString
  14. ##maskToken
  15. unmaskToken
  16. 見たことのないものもあるかと思いますが、構いませんので、一つずつ学んでいきましょう。
  17. generateRandomString

    最初に
  18. generateRandomString
と言ったのは、少なくとも私にとってはこれが最も一般的に使用されているためです。

public function generateRandomString($length = 32){...}
ランダムな文字列を生成します。パラメータ $length は文字列の長さを表します。デフォルトは 32 ビットです。この文字列の値の範囲は [A-Za-z0-9_-] であることを説明する価値があります。

generatePasswordHash & validatePassword

generatePasswordHash & validatePassword は、ユーザーのパスワードを暗号化し、パスワードが正しいかどうかを確認するためによく使用されます。MD5 は衝突する可能性があるため、yii2 を使用してアプリケーションを開発する場合は、generatePasswordHash 関数を使用します。パスワードの暗号化が最初の選択肢となり、crypt 関数が呼び出されます。

一般的な使用法は次のとおりです。

// 使用generatePasswordHash为用户的密码加密,$hash存储到库中
$hash = Yii::$app->getSecurity()->generatePasswordHash($password);

// 使用validatePassword对密码进行验证
if(Yii::$app->getSecurity()->validatePassword($password, $hash)){
    // 密码正确
}else{
    // 密码错误
}
generateRandomKey

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){}
encryptByKey & decryptByKey です。3 番目のパラメータがあります。たとえば、メンバーの ID などを渡すと、この情報が $ とともに暗号化および復号化キーとして使用されます。入力キー。 hkdf

標準の 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
の前に追加のグループが表示されます。こんにちはキャラクター。このキャラクターのセットは元のデータによって異なります。このようにして、改ざんを防ぐためにデータに特別なマークを付けた後、validateData が登場します。

注: 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を返し、その戻り速度を計算することでどちらが分かるかがわかります。ビットが異なるようになり、映画でよく登場するビットごとのパスワード解析シーンを実現します。

而使用 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中文网!

相关推荐:

Yii无法捕获到异常的解决方法

以上がyii2 暗号化と復号化の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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