0 フォロワー

クラス yii\base\Security

継承yii\base\Security » yii\base\Component » yii\base\BaseObject
実装yii\base\Configurable
利用可能なバージョン2.0
ソースコード https://github.com/yiisoft/yii2/blob/master/framework/base/Security.php

Securityは、一般的なセキュリティ関連のタスクを処理するための一連のメソッドを提供します。

特に、Securityは以下の機能をサポートしています。

注意: このクラスは、Windows上でのランダムなキー/文字列生成、およびすべてのプラットフォームでの暗号化/復号化のために 'OpenSSL' PHP拡張機能を必要とします。最高レベルのセキュリティのためには、PHPバージョン >= 5.5.0 が推奨されます。

Securityの詳細と使用方法については、セキュリティに関するガイド記事を参照してください。

公開プロパティ

継承されたプロパティを隠す

プロパティ 説明 定義元
$allowedCiphers 配列[] サポートされている各OpenSSL暗号のブロックサイズとキーサイズのルックアップテーブル。 yii\base\Security
$authKeyInfo 文字列 メッセージ認証キーを導出するためのHKDF情報値。 yii\base\Security
$behaviors yii\base\Behavior[] このコンポーネントにアタッチされたビヘイビアのリスト。 yii\base\Component
$cipher 文字列 暗号化と復号化に使用する暗号。 yii\base\Security
$derivationIterations 整数 導出の反復回数。 yii\base\Security
$kdfHash 文字列 キー導出のためのハッシュアルゴリズム。 yii\base\Security
$macHash 文字列 メッセージ認証のためのハッシュアルゴリズム。 yii\base\Security
$passwordHashCost 整数 パスワードハッシュに使用されるデフォルトのコスト。 yii\base\Security
$passwordHashStrategy 文字列 パスワードハッシュを生成するために使用する必要がある戦略。 yii\base\Security

公開メソッド

継承されたメソッドを隠す

メソッド 説明 定義元
__call() クラスメソッドではない、名前付きメソッドを呼び出します。 yii\base\Component
__clone() このメソッドは、既存のオブジェクトをクローンしてオブジェクトが作成された後に呼び出されます。 yii\base\Component
__construct() コンストラクタ。 yii\base\BaseObject
__get() コンポーネントのプロパティの値を返します。 yii\base\Component
__isset() プロパティが設定されているか、つまり定義されていてnullでないかを確認します。 yii\base\Component
__set() コンポーネントのプロパティの値を設定します。 yii\base\Component
__unset() コンポーネントのプロパティをnullに設定します。 yii\base\Component
attachBehavior() このコンポーネントにビヘイビアをアタッチします。 yii\base\Component
attachBehaviors() コンポーネントにビヘイビアのリストをアタッチします。 yii\base\Component
behaviors() このコンポーネントが動作するべきビヘイビアのリストを返します。 yii\base\Component
canGetProperty() プロパティを読み取ることができるかどうかを示す値を返します。 yii\base\Component
canSetProperty() プロパティを設定できるかどうかを示す値を返します。 yii\base\Component
className() このクラスの完全修飾名を返します。 yii\base\BaseObject
compareString() タイミング攻撃に強いアプローチを使用して文字列比較を実行します。 yii\base\Security
decryptByKey() encryptByKey()で暗号化されたデータを検証および復号化します。 yii\base\Security
decryptByPassword() encryptByPassword()で暗号化されたデータを検証および復号化します。 yii\base\Security
detachBehavior() コンポーネントからビヘイビアをデタッチします。 yii\base\Component
detachBehaviors() コンポーネントからすべてのビヘイビアをデタッチします。 yii\base\Component
encryptByKey() 暗号キーを使用してデータを暗号化します。 yii\base\Security
encryptByPassword() パスワードを使用してデータを暗号化します。 yii\base\Security
ensureBehaviors() behaviors()で宣言されたビヘイビアがこのコンポーネントにアタッチされていることを確認します。 yii\base\Component
generatePasswordHash() パスワードとランダムなソルトから安全なハッシュを生成します。 yii\base\Security
generateRandomKey() 指定された数のランダムなバイトを生成します。 yii\base\Security
generateRandomString() 指定された長さのランダムな文字列を生成します。 yii\base\Security
getBehavior() 指定された名前のビヘイビアオブジェクトを返します。 yii\base\Component
getBehaviors() このコンポーネントにアタッチされているすべてのビヘイビアを返します。 yii\base\Component
hasEventHandlers() 指定されたイベントにハンドラーがアタッチされているかどうかを示す値を返します。 yii\base\Component
hasMethod() メソッドが定義されているかどうかを示す値を返します。 yii\base\Component
hasProperty() このコンポーネントにプロパティが定義されているかどうかを示す値を返します。 yii\base\Component
hashData() 後で改ざんが検出できるように、キー付きハッシュ値でデータをプレフィックスします。 yii\base\Security
hkdf() 標準のHKDFアルゴリズムを使用して、与えられた入力キーからキーを派生させます。 yii\base\Security
init() オブジェクトを初期化します。 yii\base\BaseObject
maskToken() トークンをマスクして、圧縮できないようにします。 yii\base\Security
off() 既存のイベントハンドラーをこのコンポーネントからデタッチします。 yii\base\Component
on() イベントにイベントハンドラーをアタッチします。 yii\base\Component
pbkdf2() 標準のPBKDF2アルゴリズムを使用して、与えられたパスワードからキーを派生させます。 yii\base\Security
trigger() イベントをトリガーします。 yii\base\Component
unmaskToken() 以前にmaskTokenでマスクされたトークンをマスク解除します。 yii\base\Security
validateData() 与えられたデータが改ざんされているかどうかを検証します。 yii\base\Security
validatePassword() ハッシュに対してパスワードを検証します。 yii\base\Security

保護されたメソッド

継承されたメソッドを隠す

メソッド 説明 定義元
decrypt() データを復号化します。 yii\base\Security
encrypt() データを暗号化します。 yii\base\Security
generateSalt() パスワードハッシュの生成に使用できるソルトを生成します。 yii\base\Security
shouldUseLibreSSL() yii\base\Security

プロパティの詳細

継承されたプロパティを隠す

$allowedCiphers public プロパティ

サポートされている各OpenSSL暗号のブロックサイズとキーサイズのルックアップテーブル。

各要素で、キーはOpenSSLでサポートされている暗号の1つです(@see openssl_get_cipher_methods())。値は2つの整数の配列で、最初は暗号のブロックサイズ(バイト単位)、2番目はキーサイズ(バイト単位)です。

警告: 推奨するすべてのOpenSSL暗号はデフォルト値、つまりCBCモードのAESに含まれています。

注意: Yiiの暗号化プロトコルでは、暗号キー、HMAC署名キー、およびキー派生ソルトに同じサイズを使用します。

public array[] $allowedCiphers = [
    
'AES-128-CBC' => [
        
16,
        
16,
    ],
    
'AES-192-CBC' => [
        
16,
        
24,
    ],
    
'AES-256-CBC' => [
        
16,
        
32,
    ],
]
$authKeyInfo public プロパティ

メッセージ認証キーを導出するためのHKDF情報値。

以下も参照 hkdf().

public string $authKeyInfo 'AuthorizationKey'
$cipher public プロパティ

暗号化と復号化に使用する暗号。

public string $cipher 'AES-128-CBC'
$derivationIterations public プロパティ

派生イテレーションのカウント。辞書パスワード攻撃を防ぐために、できるだけ高く設定してください。

$kdfHash public プロパティ

キー派生のためのハッシュアルゴリズム。sha256、sha384、またはsha512をお勧めします。

以下も参照 hash_algos().

public string $kdfHash 'sha256'
$macHash public プロパティ

メッセージ認証のためのハッシュアルゴリズム。sha256、sha384、またはsha512をお勧めします。

以下も参照 hash_algos().

public string $macHash 'sha256'
$passwordHashCost public プロパティ (バージョン 2.0.6 以降で利用可能)

パスワードハッシュに使用されるデフォルトのコスト。許可される値は4から31の間です。

以下も参照 generatePasswordHash().

$passwordHashStrategy public プロパティ
バージョン 2.0.7 で非推奨になりました。generatePasswordHash()$passwordHashStrategyを無視し、利用可能な場合はpassword_hash()を、そうでない場合はcrypt()を使用します。

パスワードハッシュの生成に使用する必要がある戦略。利用可能な戦略

  • 'password_hash' - PASSWORD_DEFAULTアルゴリズムでPHP password_hash()関数を使用します。このオプションは推奨されますが、PHPバージョン>= 5.5.0が必要です
  • 'crypt' - PHP crypt()関数を使用します。

メソッドの詳細

継承されたメソッドを隠す

__call() public メソッド

定義: yii\base\Component::__call()

クラスメソッドではない、名前付きメソッドを呼び出します。

このメソッドは、アタッチされたビヘイビアに指定された名前のメソッドがあるかどうかを確認し、利用可能な場合は実行します。

このメソッドは、不明なメソッドが呼び出されたときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

public mixed __call ( $name, $params )
$name 文字列

メソッド名

$params 配列

メソッドのパラメータ

return mixed

メソッドの戻り値

throws yii\base\UnknownMethodException

不明なメソッドを呼び出した場合

                public function __call($name, $params)
{
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $object) {
        if ($object->hasMethod($name)) {
            return call_user_func_array([$object, $name], $params);
        }
    }
    throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}

            
__clone() public メソッド

定義元: yii\base\Component::__clone()

このメソッドは、既存のオブジェクトをクローンしてオブジェクトが作成された後に呼び出されます。

古いオブジェクトにアタッチされているため、すべてのビヘイビアを削除します。

public void __clone ( )

                public function __clone()
{
    $this->_events = [];
    $this->_eventWildcards = [];
    $this->_behaviors = null;
}

            
__construct() public メソッド

定義元: yii\base\BaseObject::__construct()

コンストラクタ。

デフォルトの実装では、次の2つの処理を行います。

  • 与えられた設定 $config でオブジェクトを初期化します。
  • init() を呼び出します。

このメソッドが子クラスでオーバーライドされる場合、次のことを推奨します。

  • コンストラクタの最後のパラメータは、ここでの $config のような設定配列にします。
  • コンストラクタの最後に親の実装を呼び出します。
public void __construct ( $config = [] )
$config 配列

オブジェクトのプロパティを初期化するために使用される名前と値のペア

                public function __construct($config = [])
{
    if (!empty($config)) {
        Yii::configure($this, $config);
    }
    $this->init();
}

            
__get() public メソッド

定義元: yii\base\Component::__get()

コンポーネントのプロパティの値を返します。

このメソッドは、次の順序でチェックし、それに応じて動作します。

  • getterで定義されたプロパティ: getterの結果を返す
  • ビヘイビアのプロパティ: ビヘイビアのプロパティ値を返す

このメソッドは、$value = $component->property; を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

関連項目: __set().

public mixed __get ( $name )
$name 文字列

プロパティ名

return mixed

プロパティ値、またはビヘイビアのプロパティの値

throws yii\base\UnknownPropertyException

プロパティが定義されていない場合

throws yii\base\InvalidCallException

プロパティが書き込み専用の場合

                public function __get($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        // read property, e.g. getName()
        return $this->$getter();
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canGetProperty($name)) {
            return $behavior->$name;
        }
    }
    if (method_exists($this, 'set' . $name)) {
        throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
    }
    throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}

            
__isset() public メソッド

定義元: yii\base\Component::__isset()

プロパティが設定されているか、つまり定義されていてnullでないかを確認します。

このメソッドは、次の順序でチェックし、それに応じて動作します。

  • setterで定義されたプロパティ: プロパティが設定されているかどうかを返す
  • ビヘイビアのプロパティ: プロパティが設定されているかどうかを返す
  • 存在しないプロパティに対してはfalseを返す

このメソッドは、isset($component->property) を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

関連項目: https://www.php.net/manual/en/function.isset.php.

public boolean __isset ( $name )
$name 文字列

プロパティ名またはイベント名

return boolean

指定されたプロパティが設定されているかどうか

                public function __isset($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter() !== null;
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canGetProperty($name)) {
            return $behavior->$name !== null;
        }
    }
    return false;
}

            
__set() public メソッド

定義元: yii\base\Component::__set()

コンポーネントのプロパティの値を設定します。

このメソッドは、次の順序でチェックし、それに応じて動作します。

  • setterで定義されたプロパティ: プロパティ値を設定する
  • "on xyz" の形式のイベント: "xyz" イベントにハンドラをアタッチする
  • "as xyz" の形式のビヘイビア: "xyz" という名前のビヘイビアをアタッチする
  • ビヘイビアのプロパティ: ビヘイビアのプロパティ値を設定する

このメソッドは、$component->property = $value; を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

関連項目: __get().

public void __set ( $name, $value )
$name 文字列

プロパティ名またはイベント名

$value mixed

プロパティ値

throws yii\base\UnknownPropertyException

プロパティが定義されていない場合

throws yii\base\InvalidCallException

プロパティが読み取り専用の場合

                public function __set($name, $value)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        // set property
        $this->$setter($value);
        return;
    } elseif (strncmp($name, 'on ', 3) === 0) {
        // on event: attach event handler
        $this->on(trim(substr($name, 3)), $value);
        return;
    } elseif (strncmp($name, 'as ', 3) === 0) {
        // as behavior: attach behavior
        $name = trim(substr($name, 3));
        $this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));
        return;
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canSetProperty($name)) {
            $behavior->$name = $value;
            return;
        }
    }
    if (method_exists($this, 'get' . $name)) {
        throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
    }
    throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}

            
__unset() public メソッド

定義元: yii\base\Component::__unset()

コンポーネントのプロパティをnullに設定します。

このメソッドは、次の順序でチェックし、それに応じて動作します。

  • setterで定義されたプロパティ: プロパティ値を null に設定する
  • ビヘイビアのプロパティ: プロパティ値を null に設定する

このメソッドは、unset($component->property) を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

関連項目: https://www.php.net/manual/en/function.unset.php.

public void __unset ( $name )
$name 文字列

プロパティ名

throws yii\base\InvalidCallException

プロパティが読み取り専用の場合

                public function __unset($name)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        $this->$setter(null);
        return;
    }
    // behavior property
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $behavior) {
        if ($behavior->canSetProperty($name)) {
            $behavior->$name = null;
            return;
        }
    }
    throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);
}

            
attachBehavior() public メソッド

定義元: yii\base\Component::attachBehavior()

このコンポーネントにビヘイビアをアタッチします。

このメソッドは、指定された設定に基づいてビヘイビアオブジェクトを作成します。その後、yii\base\Behavior::attach() メソッドを呼び出すことによって、ビヘイビアオブジェクトはこのコンポーネントにアタッチされます。

関連項目: detachBehavior().

public yii\base\Behavior attachBehavior ( $name, $behavior )
$name 文字列

ビヘイビアの名前。

$behavior string|array|yii\base\Behavior

ビヘイビアの設定。これは、次のいずれかになります。

  • yii\base\Behavior オブジェクト
  • ビヘイビアクラスを指定する文字列
  • ビヘイビアオブジェクトを作成するためにYii::createObject()に渡されるオブジェクト設定配列。
return yii\base\Behavior

ビヘイビアオブジェクト

                public function attachBehavior($name, $behavior)
{
    $this->ensureBehaviors();
    return $this->attachBehaviorInternal($name, $behavior);
}

            
attachBehaviors() public メソッド

定義元: yii\base\Component::attachBehaviors()

コンポーネントにビヘイビアのリストをアタッチします。

各ビヘイビアは、その名前でインデックス付けされ、yii\base\Behavior オブジェクト、ビヘイビアクラスを指定する文字列、またはビヘイビアを作成するための設定配列である必要があります。

関連項目: attachBehavior().

public void attachBehaviors ( $behaviors )
$behaviors 配列

コンポーネントにアタッチされるビヘイビアのリスト

                public function attachBehaviors($behaviors)
{
    $this->ensureBehaviors();
    foreach ($behaviors as $name => $behavior) {
        $this->attachBehaviorInternal($name, $behavior);
    }
}

            
behaviors() public メソッド

定義元: yii\base\Component::behaviors()

このコンポーネントが動作するべきビヘイビアのリストを返します。

子クラスは、このメソッドをオーバーライドして、動作させたいビヘイビアを指定できます。

このメソッドの戻り値は、ビヘイビア名でインデックスされたビヘイビアオブジェクトまたは設定の配列である必要があります。ビヘイビアの設定は、ビヘイビアクラスを指定する文字列か、次の構造の配列のいずれかになります。

'behaviorName' => [
    'class' => 'BehaviorClass',
    'property1' => 'value1',
    'property2' => 'value2',
]

ビヘイビアクラスは、yii\base\Behavior を継承する必要があることに注意してください。ビヘイビアは、名前または匿名でアタッチできます。配列のキーとして名前が使用されている場合、この名前を使用して、後で getBehavior() を使用してビヘイビアを取得したり、detachBehavior() を使用してデタッチしたりできます。匿名ビヘイビアは、取得またはデタッチできません。

このメソッドで宣言されたビヘイビアは、コンポーネントに自動的に(必要に応じて)アタッチされます。

public array behaviors ( )
return 配列

ビヘイビアの設定。

                public function behaviors()
{
    return [];
}

            
canGetProperty() public メソッド

定義元: yii\base\Component::canGetProperty()

プロパティを読み取ることができるかどうかを示す値を返します。

プロパティは、次の場合は読み取ることができます。

  • クラスが指定された名前に関連付けられたゲッターメソッドを持っている場合(この場合、プロパティ名は大文字と小文字を区別しません)。
  • クラスが指定された名前のメンバー変数を持っている場合($checkVars が true の場合)。
  • アタッチされたビヘイビアが、指定された名前の読み取り可能なプロパティを持っている場合($checkBehaviors が true の場合)。

以下も参照してください: canSetProperty()

public boolean canGetProperty ( $name, $checkVars true, $checkBehaviors true )
$name 文字列

プロパティ名

$checkVars boolean

メンバー変数をプロパティとして扱うかどうか

$checkBehaviors boolean

ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか

return boolean

プロパティが読み取れるかどうか

                public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
{
    if (method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name)) {
        return true;
    } elseif ($checkBehaviors) {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->canGetProperty($name, $checkVars)) {
                return true;
            }
        }
    }
    return false;
}

            
canSetProperty() public メソッド

定義元: yii\base\Component::canSetProperty()

プロパティを設定できるかどうかを示す値を返します。

プロパティは、次の場合は書き込むことができます。

  • クラスが指定された名前に関連付けられたセッターメソッドを持っている場合(この場合、プロパティ名は大文字と小文字を区別しません)。
  • クラスが指定された名前のメンバー変数を持っている場合($checkVars が true の場合)。
  • アタッチされたビヘイビアが、指定された名前の書き込み可能なプロパティを持っている場合($checkBehaviors が true の場合)。

以下も参照してください: canGetProperty()

public boolean canSetProperty ( $name, $checkVars true, $checkBehaviors true )
$name 文字列

プロパティ名

$checkVars boolean

メンバー変数をプロパティとして扱うかどうか

$checkBehaviors boolean

ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか

return boolean

プロパティが書き込み可能かどうか

                public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
{
    if (method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name)) {
        return true;
    } elseif ($checkBehaviors) {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->canSetProperty($name, $checkVars)) {
                return true;
            }
        }
    }
    return false;
}

            
className() public static メソッド
2.0.14以降非推奨。PHP >= 5.5 では、代わりに ::class を使用してください。

定義元: yii\base\BaseObject::className()

このクラスの完全修飾名を返します。

public static string className ( )
return 文字列

このクラスの完全修飾名。

                public static function className()
{
    return get_called_class();
}

            
compareString() public メソッド

タイミング攻撃に強いアプローチを使用して文字列比較を実行します。

以下も参照してください: https://codereview.stackexchange.com/q/13512

public boolean compareString ( $expected, $actual )
$expected 文字列

比較する文字列。

$actual 文字列

ユーザーが指定した文字列。

return boolean

文字列が等しいかどうか。

                public function compareString($expected, $actual)
{
    if (!is_string($expected)) {
        throw new InvalidArgumentException('Expected expected value to be a string, ' . gettype($expected) . ' given.');
    }
    if (!is_string($actual)) {
        throw new InvalidArgumentException('Expected actual value to be a string, ' . gettype($actual) . ' given.');
    }
    if (function_exists('hash_equals')) {
        return hash_equals($expected, $actual);
    }
    $expected .= "\0";
    $actual .= "\0";
    $expectedLength = StringHelper::byteLength($expected);
    $actualLength = StringHelper::byteLength($actual);
    $diff = $expectedLength - $actualLength;
    for ($i = 0; $i < $actualLength; $i++) {
        $diff |= (ord($actual[$i]) ^ ord($expected[$i % $expectedLength]));
    }
    return $diff === 0;
}

            
decrypt() protected メソッド

データを復号化します。

以下も参照してください: encrypt()

protected boolean|string decrypt ( $data, $passwordBased, $secret, $info )
$data 文字列

復号化する暗号化データ。

$passwordBased boolean

パスワードベースのキー導出を使用する場合はtrueに設定します

$secret 文字列

復号化パスワードまたはキー

$info string|null

コンテキスト/アプリケーション固有の情報。@see encrypt()

return boolean|string

復号化されたデータ。認証に失敗した場合はfalse。

throws yii\base\InvalidConfigException

OpenSSLがロードされていない場合

throws yii\base\Exception

OpenSSLエラーの場合

                protected function decrypt($data, $passwordBased, $secret, $info)
{
    if (!extension_loaded('openssl')) {
        throw new InvalidConfigException('Encryption requires the OpenSSL PHP extension');
    }
    if (!isset($this->allowedCiphers[$this->cipher][0], $this->allowedCiphers[$this->cipher][1])) {
        throw new InvalidConfigException($this->cipher . ' is not an allowed cipher');
    }
    list($blockSize, $keySize) = $this->allowedCiphers[$this->cipher];
    $keySalt = StringHelper::byteSubstr($data, 0, $keySize);
    if ($passwordBased) {
        $key = $this->pbkdf2($this->kdfHash, $secret, $keySalt, $this->derivationIterations, $keySize);
    } else {
        $key = $this->hkdf($this->kdfHash, $secret, $keySalt, $info, $keySize);
    }
    $authKey = $this->hkdf($this->kdfHash, $key, null, $this->authKeyInfo, $keySize);
    $data = $this->validateData(StringHelper::byteSubstr($data, $keySize, null), $authKey);
    if ($data === false) {
        return false;
    }
    $iv = StringHelper::byteSubstr($data, 0, $blockSize);
    $encrypted = StringHelper::byteSubstr($data, $blockSize, null);
    $decrypted = openssl_decrypt($encrypted, $this->cipher, $key, OPENSSL_RAW_DATA, $iv);
    if ($decrypted === false) {
        throw new \yii\base\Exception('OpenSSL failure on decryption: ' . openssl_error_string());
    }
    return $decrypted;
}

            
decryptByKey() public メソッド

encryptByKey()で暗号化されたデータを検証および復号化します。

以下も参照してください: encryptByKey()

public boolean|string decryptByKey ( $data, $inputKey, $info null )
$data 文字列

復号化する暗号化データ

$inputKey 文字列

暗号化と認証に使用する入力

$info string|null

オプションのコンテキストおよびアプリケーション固有の情報。 hkdf() を参照してください。

return boolean|string

復号化されたデータ。認証に失敗した場合はfalse。

                public function decryptByKey($data, $inputKey, $info = null)
{
    return $this->decrypt($data, false, $inputKey, $info);
}

            
decryptByPassword() public メソッド

encryptByPassword()で暗号化されたデータを検証および復号化します。

以下も参照してください: encryptByPassword()

public boolean|string decryptByPassword ( $data, $password )
$data 文字列

復号化する暗号化データ

$password 文字列

復号化に使用するパスワード

return boolean|string

復号化されたデータ。認証に失敗した場合はfalse。

                public function decryptByPassword($data, $password)
{
    return $this->decrypt($data, true, $password, null);
}

            
detachBehavior() public メソッド

定義元: yii\base\Component::detachBehavior()

コンポーネントからビヘイビアをデタッチします。

ビヘイビアの yii\base\Behavior::detach() メソッドが呼び出されます。

public yii\base\Behavior|null detachBehavior ( $name )
$name 文字列

ビヘイビアの名前。

return yii\base\Behavior|null

デタッチされたビヘイビア。ビヘイビアが存在しない場合はNull。

                public function detachBehavior($name)
{
    $this->ensureBehaviors();
    if (isset($this->_behaviors[$name])) {
        $behavior = $this->_behaviors[$name];
        unset($this->_behaviors[$name]);
        $behavior->detach();
        return $behavior;
    }
    return null;
}

            
detachBehaviors() public メソッド

定義元: yii\base\Component::detachBehaviors()

コンポーネントからすべてのビヘイビアをデタッチします。

public void detachBehaviors ( )

                public function detachBehaviors()
{
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $name => $behavior) {
        $this->detachBehavior($name);
    }
}

            
encrypt() protected メソッド

データを暗号化します。

参照: decrypt()

protected string encrypt ( $data, $passwordBased, $secret, $info )
$data 文字列

暗号化するデータ

$passwordBased boolean

パスワードベースのキー導出を使用する場合はtrueに設定します

$secret 文字列

暗号化パスワードまたはキー

$info string|null

コンテキスト/アプリケーション固有の情報 (例: ユーザー ID)。詳細は RFC 5869 Section 3.2 を参照してください。

return 文字列

暗号化されたデータ (バイト文字列)

throws yii\base\InvalidConfigException

OpenSSLがロードされていない場合

throws yii\base\Exception

OpenSSLエラーの場合

                protected function encrypt($data, $passwordBased, $secret, $info)
{
    if (!extension_loaded('openssl')) {
        throw new InvalidConfigException('Encryption requires the OpenSSL PHP extension');
    }
    if (!isset($this->allowedCiphers[$this->cipher][0], $this->allowedCiphers[$this->cipher][1])) {
        throw new InvalidConfigException($this->cipher . ' is not an allowed cipher');
    }
    list($blockSize, $keySize) = $this->allowedCiphers[$this->cipher];
    $keySalt = $this->generateRandomKey($keySize);
    if ($passwordBased) {
        $key = $this->pbkdf2($this->kdfHash, $secret, $keySalt, $this->derivationIterations, $keySize);
    } else {
        $key = $this->hkdf($this->kdfHash, $secret, $keySalt, $info, $keySize);
    }
    $iv = $this->generateRandomKey($blockSize);
    $encrypted = openssl_encrypt($data, $this->cipher, $key, OPENSSL_RAW_DATA, $iv);
    if ($encrypted === false) {
        throw new \yii\base\Exception('OpenSSL failure on encryption: ' . openssl_error_string());
    }
    $authKey = $this->hkdf($this->kdfHash, $key, null, $this->authKeyInfo, $keySize);
    $hashed = $this->hashData($iv . $encrypted, $authKey);
    /*
     * Output: [keySalt][MAC][IV][ciphertext]
     * - keySalt is KEY_SIZE bytes long
     * - MAC: message authentication code, length same as the output of MAC_HASH
     * - IV: initialization vector, length $blockSize
     */
    return $keySalt . $hashed;
}

            
encryptByKey() public メソッド

暗号キーを使用してデータを暗号化します。

encryptByPassword() に比べて非常に高速な HKDF とランダムなソルトを使用して、入力キーから暗号化と認証のためのキーを導出します。入力キーは適切にランダムである必要があります。キーを生成するには、generateRandomKey() を使用してください。暗号化されたデータには、キー付きメッセージ認証コード (MAC) が含まれるため、入力データまたは出力データをハッシュする必要はありません。

参照

public string encryptByKey ( $data, $inputKey, $info null )
$data 文字列

暗号化するデータ

$inputKey 文字列

暗号化と認証に使用する入力

$info string|null

オプションのコンテキストおよびアプリケーション固有の情報。 hkdf() を参照してください。

return 文字列

暗号化されたデータ (バイト文字列)

                public function encryptByKey($data, $inputKey, $info = null)
{
    return $this->encrypt($data, false, $inputKey, $info);
}

            
encryptByPassword() public メソッド

パスワードを使用してデータを暗号化します。

辞書攻撃から保護するために意図的に遅くなる PBKDF2 とランダムなソルトを使用して、パスワードから暗号化と認証のためのキーを導出します。パスワードではなく暗号化キーを使用して高速に暗号化するには、encryptByKey() を使用してください。キーの導出時間は $derivationIterations によって決定されます。これはできるだけ高く設定する必要があります。暗号化されたデータには、キー付きメッセージ認証コード (MAC) が含まれるため、入力データまたは出力データをハッシュする必要はありません。> 注: 可能な限り、パスワードでの暗号化は避けてください。低品質なパスワードや侵害されたパスワードから保護できるものはありません。

参照

public string encryptByPassword ( $data, $password )
$data 文字列

暗号化するデータ

$password 文字列

暗号化に使用するパスワード

return 文字列

暗号化されたデータ (バイト文字列)

                public function encryptByPassword($data, $password)
{
    return $this->encrypt($data, true, $password, null);
}

            
ensureBehaviors() public メソッド

定義元: yii\base\Component::ensureBehaviors()

behaviors()で宣言されたビヘイビアがこのコンポーネントにアタッチされていることを確認します。

public void ensureBehaviors ( )

                public function ensureBehaviors()
{
    if ($this->_behaviors === null) {
        $this->_behaviors = [];
        foreach ($this->behaviors() as $name => $behavior) {
            $this->attachBehaviorInternal($name, $behavior);
        }
    }
}

            
generatePasswordHash() public メソッド

パスワードとランダムなソルトから安全なハッシュを生成します。

生成されたハッシュはデータベースに保存できます。後でパスワードを検証する必要がある場合は、ハッシュを取得して validatePassword() に渡すことができます。例:

// generates the hash (usually done during user registration or when the password is changed)
$hash = Yii::$app->getSecurity()->generatePasswordHash($password);
// ...save $hash in database...

// during login, validate if the password entered is correct using $hash fetched from database
if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
    // password is good
} else {
    // password is bad
}

参照: validatePassword()

public string generatePasswordHash ( $password, $cost null )
$password 文字列

ハッシュ化するパスワード。

$cost integer|null

Blowfish ハッシュアルゴリズムで使用されるコストパラメータ。コストの値が大きいほど、ハッシュの生成とそれに対するパスワードの検証にかかる時間が長くなります。したがって、コストが高いほど、ブルートフォース攻撃が遅くなります。ブルートフォース攻撃に対する最良の保護のためには、本番サーバーで許容できる最大値に設定してください。ハッシュを計算するのにかかる時間は、$cost の 1 増加ごとに 2 倍になります。

return 文字列

パスワードハッシュ文字列。$passwordHashStrategy が 'crypt' に設定されている場合、出力は常に 60 ASCII 文字ですが、'password_hash' に設定されている場合、出力長は PHP の将来のバージョンで増加する可能性があります (https://www.php.net/manual/en/function.password-hash.php)

throws yii\base\Exception

パスワードパラメータまたはコストパラメータが不正な場合。

                public function generatePasswordHash($password, $cost = null)
{
    if ($cost === null) {
        $cost = $this->passwordHashCost;
    }
    if (function_exists('password_hash')) {
        /* @noinspection PhpUndefinedConstantInspection */
        return password_hash($password, PASSWORD_DEFAULT, ['cost' => $cost]);
    }
    $salt = $this->generateSalt($cost);
    $hash = crypt($password, $salt);
    // strlen() is safe since crypt() returns only ascii
    if (!is_string($hash) || strlen($hash) !== 60) {
        throw new Exception('Unknown error occurred while generating hash.');
    }
    return $hash;
}

            
generateRandomKey() public メソッド

指定された数のランダムなバイトを生成します。

出力は ASCII ではない可能性があることに注意してください。

文字列が必要な場合は、generateRandomString() も参照してください。

public string generateRandomKey ( $length 32 )
$length 整数

生成するバイト数

return 文字列

生成されたランダムバイト

throws yii\base\InvalidArgumentException

間違った長さが指定された場合

throws yii\base\Exception

失敗した場合。

                public function generateRandomKey($length = 32)
{
    if (!is_int($length)) {
        throw new InvalidArgumentException('First parameter ($length) must be an integer');
    }
    if ($length < 1) {
        throw new InvalidArgumentException('First parameter ($length) must be greater than 0');
    }
    return random_bytes($length);
}

            
generateRandomString() public メソッド

指定された長さのランダムな文字列を生成します。

生成された文字列は [A-Za-z0-9_-]+ に一致し、URL エンコードに対して透過的です。

public string generateRandomString ( $length 32 )
$length 整数

文字単位のキーの長さ

return 文字列

生成されたランダムキー

throws yii\base\Exception

失敗した場合。

                public function generateRandomString($length = 32)
{
    if (!is_int($length)) {
        throw new InvalidArgumentException('First parameter ($length) must be an integer');
    }
    if ($length < 1) {
        throw new InvalidArgumentException('First parameter ($length) must be greater than 0');
    }
    $bytes = $this->generateRandomKey($length);
    return substr(StringHelper::base64UrlEncode($bytes), 0, $length);
}

            
generateSalt() protected メソッド

パスワードハッシュの生成に使用できるソルトを生成します。

PHP の crypt() 組み込み関数では、Blowfish ハッシュアルゴリズムの場合、特定の形式のソルト文字列が必要です: "$2a$", "$2x$" または "$2y$"、2 桁のコストパラメータ、"$"、およびアルファベット "./0-9A-Za-z" からの 22 文字。

protected string generateSalt ( $cost 13 )
$cost 整数

コストパラメータ

return 文字列

ランダムなソルト値。

throws yii\base\InvalidArgumentException

コストパラメータが 4 から 31 の範囲外の場合。

                protected function generateSalt($cost = 13)
{
    $cost = (int) $cost;
    if ($cost < 4 || $cost > 31) {
        throw new InvalidArgumentException('Cost must be between 4 and 31.');
    }
    // Get a 20-byte random string
    $rand = $this->generateRandomKey(20);
    // Form the prefix that specifies Blowfish (bcrypt) algorithm and cost parameter.
    $salt = sprintf('$2y$%02d$', $cost);
    // Append the random salt data in the required base64 format.
    $salt .= str_replace('+', '.', substr(base64_encode($rand), 0, 22));
    return $salt;
}

            
getBehavior() public メソッド

定義元: yii\base\Component::getBehavior()

指定された名前のビヘイビアオブジェクトを返します。

public yii\base\Behavior|null getBehavior ( $name )
$name 文字列

ビヘイビア名

return yii\base\Behavior|null

ビヘイビアオブジェクト。または、ビヘイビアが存在しない場合は null。

                public function getBehavior($name)
{
    $this->ensureBehaviors();
    return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}

            
getBehaviors() public メソッド

定義元: yii\base\Component::getBehaviors()

このコンポーネントにアタッチされているすべてのビヘイビアを返します。

public yii\base\Behavior[] getBehaviors ( )
return yii\base\Behavior[]

このコンポーネントにアタッチされたビヘイビアのリスト

                public function getBehaviors()
{
    $this->ensureBehaviors();
    return $this->_behaviors;
}

            
hasEventHandlers() public メソッド

定義元: yii\base\Component::hasEventHandlers()

指定されたイベントにハンドラーがアタッチされているかどうかを示す値を返します。

public boolean hasEventHandlers ( $name )
$name 文字列

イベント名

return boolean

イベントにアタッチされたハンドラーが存在するかどうか。

                public function hasEventHandlers($name)
{
    $this->ensureBehaviors();
    if (!empty($this->_events[$name])) {
        return true;
    }
    foreach ($this->_eventWildcards as $wildcard => $handlers) {
        if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) {
            return true;
        }
    }
    return Event::hasHandlers($this, $name);
}

            
hasMethod() public メソッド

定義元: yii\base\Component::hasMethod()

メソッドが定義されているかどうかを示す値を返します。

メソッドが定義されているのは、以下のいずれかの場合です。

  • クラスが指定された名前のメソッドを持っている場合
  • アタッチされたビヘイビアが指定された名前のメソッドを持っている場合($checkBehaviors が true の場合)。
public boolean hasMethod ( $name, $checkBehaviors true )
$name 文字列

プロパティ名

$checkBehaviors boolean

ビヘイビアのメソッドをこのコンポーネントのメソッドとして扱うかどうか

return boolean

メソッドが定義されているかどうか

                public function hasMethod($name, $checkBehaviors = true)
{
    if (method_exists($this, $name)) {
        return true;
    } elseif ($checkBehaviors) {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $behavior) {
            if ($behavior->hasMethod($name)) {
                return true;
            }
        }
    }
    return false;
}

            
hasProperty() public メソッド

定義元: yii\base\Component::hasProperty()

このコンポーネントにプロパティが定義されているかどうかを示す値を返します。

プロパティが定義されているのは、以下のいずれかの場合です。

  • クラスが指定された名前に関連付けられたゲッターまたはセッターメソッドを持っている場合(この場合、プロパティ名は大文字と小文字を区別しません)。
  • クラスが指定された名前のメンバー変数を持っている場合($checkVars が true の場合)。
  • アタッチされたビヘイビアが指定された名前のプロパティを持っている場合($checkBehaviors が true の場合)。

参照

public boolean hasProperty ( $name, $checkVars true, $checkBehaviors true )
$name 文字列

プロパティ名

$checkVars boolean

メンバー変数をプロパティとして扱うかどうか

$checkBehaviors boolean

ビヘイビアのプロパティをこのコンポーネントのプロパティとして扱うかどうか

return boolean

プロパティが定義されているかどうか

                public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
    return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}

            
hashData() public メソッド

後で改ざんが検出できるように、キー付きハッシュ値でデータをプレフィックスします。

encryptByKey() または encryptByPassword() の入力または出力に対してハッシュをかける必要はありません。これらのメソッドがそのタスクを実行するからです。

参照

public string hashData ( $data, $key, $rawHash false )
$data 文字列

保護されるデータ

$key 文字列

ハッシュ生成に使用する秘密鍵。安全な暗号鍵である必要があります。

$rawHash boolean

生成されたハッシュ値が raw バイナリ形式であるかどうか。false の場合は、小文字の 16 進数が生成されます。

return 文字列

キー付きハッシュがプレフィックスとして付加されたデータ

throws yii\base\InvalidConfigException

HMAC の生成に失敗した場合。

                public function hashData($data, $key, $rawHash = false)
{
    $hash = hash_hmac($this->macHash, $data, $key, $rawHash);
    if (!$hash) {
        throw new InvalidConfigException('Failed to generate HMAC with hash algorithm: ' . $this->macHash);
    }
    return $hash . $data;
}

            
hkdf() public メソッド

標準のHKDFアルゴリズムを使用して、与えられた入力キーからキーを派生させます。

RFC 5869 で指定されている HKDF を実装します。 SHA-2 ハッシュアルゴリズム(sha224、sha256、sha384、または sha512)のいずれかを使用することを推奨します。

public string hkdf ( $algo, $inputKey, $salt null, $info null, $length 0 )
$algo 文字列

hash_hmac() でサポートされるハッシュアルゴリズム。例: 'SHA-256'

$inputKey 文字列

ソースキー

$salt string|null

ランダムなソルト

$info string|null

派生キーマテリアルをアプリケーションとコンテキスト固有の情報(ユーザー ID や API バージョンなど)にバインドするためのオプションの情報。RFC 5869 を参照してください。

$length 整数

出力キーの長さ(バイト単位)。0 の場合、出力キーはハッシュアルゴリズムの出力の長さになります。

return 文字列

派生キー

throws yii\base\InvalidArgumentException

HMAC の生成に失敗した場合。

                public function hkdf($algo, $inputKey, $salt = null, $info = null, $length = 0)
{
    if (function_exists('hash_hkdf')) {
        $outputKey = hash_hkdf((string)$algo, (string)$inputKey, $length, (string)$info, (string)$salt);
        if ($outputKey === false) {
            throw new InvalidArgumentException('Invalid parameters to hash_hkdf()');
        }
        return $outputKey;
    }
    $test = @hash_hmac($algo, '', '', true);
    if (!$test) {
        throw new InvalidArgumentException('Failed to generate HMAC with hash algorithm: ' . $algo);
    }
    $hashLength = StringHelper::byteLength($test);
    if (is_string($length) && preg_match('{^\d{1,16}$}', $length)) {
        $length = (int) $length;
    }
    if (!is_int($length) || $length < 0 || $length > 255 * $hashLength) {
        throw new InvalidArgumentException('Invalid length');
    }
    $blocks = $length !== 0 ? ceil($length / $hashLength) : 1;
    if ($salt === null) {
        $salt = str_repeat("\0", $hashLength);
    }
    $prKey = hash_hmac($algo, $inputKey, $salt, true);
    $hmac = '';
    $outputKey = '';
    for ($i = 1; $i <= $blocks; $i++) {
        $hmac = hash_hmac($algo, $hmac . $info . chr($i), $prKey, true);
        $outputKey .= $hmac;
    }
    if ($length !== 0) {
        $outputKey = StringHelper::byteSubstr($outputKey, 0, $length);
    }
    return $outputKey;
}

            
init() public メソッド

定義元: yii\base\BaseObject::init()

オブジェクトを初期化します。

このメソッドは、オブジェクトが与えられた構成で初期化された後、コンストラクタの最後に呼び出されます。

public void init ( )

                public function init()
{
}

            
maskToken() public メソッド (バージョン 2.0.12 以降で利用可能)

トークンをマスクして、圧縮できないようにします。

トークンにランダムなマスクを適用し、結果に使用されたマスクを先頭に追加して、文字列を常に一意にします。各リクエストでトークンが出力される方法をランダム化することにより、BREACH 攻撃を軽減するために使用されます。

public string maskToken ( $token )
$token 文字列

マスクされていないトークン。

return 文字列

マスクされたトークン。

                public function maskToken($token)
{
    // The number of bytes in a mask is always equal to the number of bytes in a token.
    $mask = $this->generateRandomKey(StringHelper::byteLength($token));
    return StringHelper::base64UrlEncode($mask . ($mask ^ $token));
}

            
off() public メソッド

定義元: yii\base\Component::off()

既存のイベントハンドラーをこのコンポーネントからデタッチします。

このメソッドは、on() の反対です。

注意: イベント名にワイルドカードパターンが渡された場合、このワイルドカードで登録されたハンドラーのみが削除され、このワイルドカードに一致するプレーンな名前で登録されたハンドラーは残ります。

on() も参照してください。

public boolean off ( $name, $handler null )
$name 文字列

イベント名

$handler callable|null

削除するイベントハンドラー。 null の場合、名前付きイベントにアタッチされているすべてのハンドラーが削除されます。

return boolean

ハンドラーが見つかって切り離された場合

                public function off($name, $handler = null)
{
    $this->ensureBehaviors();
    if (empty($this->_events[$name]) && empty($this->_eventWildcards[$name])) {
        return false;
    }
    if ($handler === null) {
        unset($this->_events[$name], $this->_eventWildcards[$name]);
        return true;
    }
    $removed = false;
    // plain event names
    if (isset($this->_events[$name])) {
        foreach ($this->_events[$name] as $i => $event) {
            if ($event[0] === $handler) {
                unset($this->_events[$name][$i]);
                $removed = true;
            }
        }
        if ($removed) {
            $this->_events[$name] = array_values($this->_events[$name]);
            return true;
        }
    }
    // wildcard event names
    if (isset($this->_eventWildcards[$name])) {
        foreach ($this->_eventWildcards[$name] as $i => $event) {
            if ($event[0] === $handler) {
                unset($this->_eventWildcards[$name][$i]);
                $removed = true;
            }
        }
        if ($removed) {
            $this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
            // remove empty wildcards to save future redundant regex checks:
            if (empty($this->_eventWildcards[$name])) {
                unset($this->_eventWildcards[$name]);
            }
        }
    }
    return $removed;
}

            
on() public メソッド

定義元: yii\base\Component::on()

イベントにイベントハンドラーをアタッチします。

イベントハンドラーは有効な PHP コールバックである必要があります。次にいくつかの例を示します。

function ($event) { ... }         // anonymous function
[$object, 'handleClick']          // $object->handleClick()
['Page', 'handleClick']           // Page::handleClick()
'handleClick'                     // global function handleClick()

イベントハンドラーは、次のシグネチャで定義する必要があります。

function ($event)

ここで、$event はイベントに関連付けられたパラメーターを含む yii\base\Event オブジェクトです。

2.0.14 以降、イベント名をワイルドカードパターンとして指定できます。

$component->on('event.group.*', function ($event) {
    Yii::trace($event->name . ' is triggered.');
});

off() も参照してください。

public void on ( $name, $handler, $data null, $append true )
$name 文字列

イベント名

$handler callable

イベントハンドラー

$data mixed

イベントがトリガーされたときにイベントハンドラーに渡されるデータ。イベントハンドラーが呼び出されると、このデータは yii\base\Event::$data を介してアクセスできます。

$append boolean

新しいイベントハンドラーを既存のハンドラーリストの末尾に追加するかどうか。 false の場合、新しいハンドラーは既存のハンドラーリストの先頭に挿入されます。

                public function on($name, $handler, $data = null, $append = true)
{
    $this->ensureBehaviors();
    if (strpos($name, '*') !== false) {
        if ($append || empty($this->_eventWildcards[$name])) {
            $this->_eventWildcards[$name][] = [$handler, $data];
        } else {
            array_unshift($this->_eventWildcards[$name], [$handler, $data]);
        }
        return;
    }
    if ($append || empty($this->_events[$name])) {
        $this->_events[$name][] = [$handler, $data];
    } else {
        array_unshift($this->_events[$name], [$handler, $data]);
    }
}

            
pbkdf2() public メソッド

標準のPBKDF2アルゴリズムを使用して、与えられたパスワードからキーを派生させます。

RFC 2898 で規定された HKDF2 を実装します。SHA-2 ハッシュアルゴリズム(sha224, sha256, sha384, sha512)のいずれかの使用を推奨します。

public string pbkdf2 ( $algo, $password, $salt, $iterations, $length 0 )
$algo 文字列

hash_hmac() でサポートされるハッシュアルゴリズム。例: 'SHA-256'

$password 文字列

元のパスワード

$salt 文字列

ランダムなソルト

$iterations 整数

ハッシュアルゴリズムの反復回数。辞書攻撃を防ぐためにできるだけ高く設定してください。

$length 整数

出力キーの長さ(バイト単位)。0 の場合、出力キーはハッシュアルゴリズムの出力の長さになります。

return 文字列

派生キー

throws yii\base\InvalidArgumentException

無効なパラメータが指定されたため、ハッシュ生成に失敗した場合。

                public function pbkdf2($algo, $password, $salt, $iterations, $length = 0)
{
    if (function_exists('hash_pbkdf2') && PHP_VERSION_ID >= 50500) {
        $outputKey = hash_pbkdf2($algo, $password, $salt, $iterations, $length, true);
        if ($outputKey === false) {
            throw new InvalidArgumentException('Invalid parameters to hash_pbkdf2()');
        }
        return $outputKey;
    }
    // todo: is there a nice way to reduce the code repetition in hkdf() and pbkdf2()?
    $test = @hash_hmac($algo, '', '', true);
    if (!$test) {
        throw new InvalidArgumentException('Failed to generate HMAC with hash algorithm: ' . $algo);
    }
    if (is_string($iterations) && preg_match('{^\d{1,16}$}', $iterations)) {
        $iterations = (int) $iterations;
    }
    if (!is_int($iterations) || $iterations < 1) {
        throw new InvalidArgumentException('Invalid iterations');
    }
    if (is_string($length) && preg_match('{^\d{1,16}$}', $length)) {
        $length = (int) $length;
    }
    if (!is_int($length) || $length < 0) {
        throw new InvalidArgumentException('Invalid length');
    }
    $hashLength = StringHelper::byteLength($test);
    $blocks = $length !== 0 ? ceil($length / $hashLength) : 1;
    $outputKey = '';
    for ($j = 1; $j <= $blocks; $j++) {
        $hmac = hash_hmac($algo, $salt . pack('N', $j), $password, true);
        $xorsum = $hmac;
        for ($i = 1; $i < $iterations; $i++) {
            $hmac = hash_hmac($algo, $hmac, $password, true);
            $xorsum ^= $hmac;
        }
        $outputKey .= $xorsum;
    }
    if ($length !== 0) {
        $outputKey = StringHelper::byteSubstr($outputKey, 0, $length);
    }
    return $outputKey;
}

            
shouldUseLibreSSL() protected メソッド (バージョン 2.0.36 から利用可能)

protected boolean shouldUseLibreSSL ( )
return boolean

LibreSSL を使用する必要があるかどうか。バージョン 2.1.5 以上を使用してください。

                protected function shouldUseLibreSSL()
{
    if ($this->_useLibreSSL === null) {
        // Parse OPENSSL_VERSION_TEXT because OPENSSL_VERSION_NUMBER is no use for LibreSSL.
        // https://bugs.php.net/bug.php?id=71143
        $this->_useLibreSSL = defined('OPENSSL_VERSION_TEXT')
            && preg_match('{^LibreSSL (\d\d?)\.(\d\d?)\.(\d\d?)$}', OPENSSL_VERSION_TEXT, $matches)
            && (10000 * $matches[1]) + (100 * $matches[2]) + $matches[3] >= 20105;
    }
    return $this->_useLibreSSL;
}

            
trigger() public メソッド

定義元: yii\base\Component::trigger()

イベントをトリガーします。

このメソッドは、イベントの発生を表します。クラスレベルのハンドラを含む、イベントにアタッチされたすべてのハンドラを呼び出します。

public void trigger ( $name, yii\base\Event $event null )
$name 文字列

イベント名

$event yii\base\Event|null

イベントインスタンス。設定されていない場合は、デフォルトの yii\base\Event オブジェクトが作成されます。

                public function trigger($name, Event $event = null)
{
    $this->ensureBehaviors();
    $eventHandlers = [];
    foreach ($this->_eventWildcards as $wildcard => $handlers) {
        if (StringHelper::matchWildcard($wildcard, $name)) {
            $eventHandlers[] = $handlers;
        }
    }
    if (!empty($this->_events[$name])) {
        $eventHandlers[] = $this->_events[$name];
    }
    if (!empty($eventHandlers)) {
        $eventHandlers = call_user_func_array('array_merge', $eventHandlers);
        if ($event === null) {
            $event = new Event();
        }
        if ($event->sender === null) {
            $event->sender = $this;
        }
        $event->handled = false;
        $event->name = $name;
        foreach ($eventHandlers as $handler) {
            $event->data = $handler[1];
            call_user_func($handler[0], $event);
            // stop further handling if the event is handled
            if ($event->handled) {
                return;
            }
        }
    }
    // invoke class-level attached handlers
    Event::trigger($this, $name, $event);
}

            
unmaskToken() public メソッド (バージョン 2.0.12 から利用可能)

以前にmaskTokenでマスクされたトークンをマスク解除します。

public string unmaskToken ( $maskedToken )
$maskedToken 文字列

マスクされたトークン。

return 文字列

マスクされていないトークン。または、トークン形式が無効な場合は空の文字列。

                public function unmaskToken($maskedToken)
{
    $decoded = StringHelper::base64UrlDecode($maskedToken);
    $length = StringHelper::byteLength($decoded) / 2;
    // Check if the masked token has an even length.
    if (!is_int($length)) {
        return '';
    }
    return StringHelper::byteSubstr($decoded, $length, $length) ^ StringHelper::byteSubstr($decoded, 0, $length);
}

            
validateData() public メソッド

与えられたデータが改ざんされているかどうかを検証します。

参照 hashData()

public string|false validateData ( $data, $key, $rawHash false )
$data 文字列

検証対象のデータ。データは、事前に hashData() で生成されている必要があります。

$key 文字列

hashData() でデータのハッシュを生成するために以前に使用した秘密鍵。システムでサポートされているハッシュアルゴリズムを確認するには、この関数を使用してください。これは、データのハッシュを生成するときに hashData() に渡された値と同じである必要があります。

$rawHash boolean

hashData() を使用してデータを生成するときと同じ値にする必要があります。これは、データのハッシュ値がバイナリ形式であるかどうかを示します。 false の場合、ハッシュ値は小文字の16進数のみで構成されることを意味します。16進数が生成されます。

return string|false

ハッシュが削除された実際のデータ。データが改ざんされている場合は false。

throws yii\base\InvalidConfigException

HMAC の生成に失敗した場合。

                public function validateData($data, $key, $rawHash = false)
{
    $test = @hash_hmac($this->macHash, '', '', $rawHash);
    if (!$test) {
        throw new InvalidConfigException('Failed to generate HMAC with hash algorithm: ' . $this->macHash);
    }
    $hashLength = StringHelper::byteLength($test);
    if (StringHelper::byteLength($data) >= $hashLength) {
        $hash = StringHelper::byteSubstr($data, 0, $hashLength);
        $pureData = StringHelper::byteSubstr($data, $hashLength, null);
        $calculatedHash = hash_hmac($this->macHash, $pureData, $key, $rawHash);
        if ($this->compareString($hash, $calculatedHash)) {
            return $pureData;
        }
    }
    return false;
}

            
validatePassword() public メソッド

ハッシュに対してパスワードを検証します。

以下も参照 generatePasswordHash().

public boolean validatePassword ( $password, $hash )
$password 文字列

検証するパスワード。

$hash 文字列

パスワードを検証するためのハッシュ。

return boolean

パスワードが正しいかどうか。

throws yii\base\InvalidArgumentException

パスワード/ハッシュパラメータが不正な場合、または Blowfish ハッシュを使用した crypt() が利用できない場合。

                public function validatePassword($password, $hash)
{
    if (!is_string($password) || $password === '') {
        throw new InvalidArgumentException('Password must be a string and cannot be empty.');
    }
    if (
        !preg_match('/^\$2[axy]\$(\d\d)\$[\.\/0-9A-Za-z]{22}/', $hash, $matches)
        || $matches[1] < 4
        || $matches[1] > 30
    ) {
        throw new InvalidArgumentException('Hash is invalid.');
    }
    if (function_exists('password_verify')) {
        return password_verify($password, $hash);
    }
    $test = crypt($password, $hash);
    $n = strlen($test);
    if ($n !== 60) {
        return false;
    }
    return $this->compareString($test, $hash);
}