CSecurityManager
| Пакет | system.base |
|---|---|
| Наследование | class CSecurityManager » CApplicationComponent » CComponent |
| Реализует | IApplicationComponent |
| С момента | 1.0 |
| Исходный код | framework/base/CSecurityManager.php |
CSecurityManager используется компонентами и приложениями Yii для задач, связанных с безопасностью. Например, он используется в проверке куки для предотвращения изменения данных куки.
CSecurityManager в основном используется для защиты данных от подмены и просмотра. Он может генерировать HMAC и шифровать данные. Закрытый ключ, используемый для генерации HMAC, задаётся параметром ValidationKey. Ключ, используемый для шифрования данных, задаётся параметром EncryptionKey. Если указанные ключи не заданы явно, будут сгенерированы и использованы случайные ключи.
Для защиты данных с помощью HMAC, вызовите метод hashData(); для проверки целостности данных, вызовите метод validateData(), который вернёт исходные данные, если они не были изменены. Алгоритм, используемый для генерации HMAC, задаётся параметром validation.
Для шифрования и дешифрования данных, вызовите методы encrypt() и decrypt() соответственно, которые используют алгоритм шифрования 3DES. Обратите внимание, что для работы необходимо установить и загрузить расширение PHP Mcrypt.
CSecurityManager является основным компонентом приложения, к которому можно обратиться через CApplication::getSecurityManager().
Свойства общего доступа
| Свойство | Тип | Описание | Определено в |
|---|---|---|---|
| behaviors | array | поведения, которые должны быть присоединены к данному компоненту. | CApplicationComponent |
| cryptAlgorithm | mixed | имя алгоритма шифрования, используемого методами encrypt и decrypt. | CSecurityManager |
| encryptionKey | string | закрытый ключ, используемый для шифрования/дешифрования данных. | CSecurityManager |
| hashAlgorithm | string | имя алгоритма хэширования, используемого методом computeHMAC. | CSecurityManager |
| isInitialized | boolean | Проверяет, был ли инициализирован компонент приложения. | CApplicationComponent |
| validateEncryptionKey | boolean | требуется ли проверка ключа шифрования | CSecurityManager |
| validation | string | Данный метод устарел с версии 1.1.3. | CSecurityManager |
| validationKey | string | закрытый ключ, используемый для генерации HMAC. | CSecurityManager |
Защищённые свойства
| Свойство | Тип | Описание | Определено в |
|---|---|---|---|
| encryptionKeyMinimumLengths | array | известные минимальные длины для каждого алгоритма шифрования | CSecurityManager |
Общедоступные методы
| Метод | Описание | Определено в |
|---|---|---|
| __call() | Вызывает метод с заданным именем, который не является методом класса. | CComponent |
| __get() | Возвращает значение свойства, список обработчиков событий или поведение по его имени. | CComponent |
| __isset() | Проверяет, является ли значение свойства нулевым. | CComponent |
| __set() | Устанавливает значение свойства компонента. | CComponent |
| __unset() | Устанавливает свойство компонента в значение null. | CComponent |
| asa() | Возвращает объект поведения с заданным именем. | CComponent |
| attachBehavior() | Прикрепляет поведение к этому компоненту. | CComponent |
| attachBehaviors() | Прикрепляет список поведений к компоненту. | CComponent |
| attachEventHandler() | Прикрепляет обработчик событий к событию. | CComponent |
| canGetProperty() | Определяет, можно ли считать свойство. | CComponent |
| canSetProperty() | Определяет, можно ли установить свойство. | CComponent |
| compareString() | Выполняет сравнение строк с использованием подхода, устойчивого к атакам с замерами времени. | CSecurityManager |
| computeHMAC() | Вычисляет HMAC для данных с помощью validationKey. Этот метод был сделан общедоступным. | CSecurityManager |
| decrypt() | Расшифровывает данные. | CSecurityManager |
| detachBehavior() | Открепляет поведение от компонента. | CComponent |
| detachBehaviors() | Открепляет все поведения от компонента. | CComponent |
| detachEventHandler() | Открепляет существующий обработчик событий. | CComponent |
| disableBehavior() | Отключает прикрепленное поведение. | CComponent |
| disableBehaviors() | Отключает все прикрепленные к этому компоненту поведения. | CComponent |
| enableBehavior() | Включает прикрепленное поведение. | CComponent |
| enableBehaviors() | Включает все прикрепленные к этому компоненту поведения. | CComponent |
| encrypt() | Шифрует данные. | CSecurityManager |
| evaluateExpression() | Вычисляет выражение PHP или обратный вызов в контексте этого компонента. | CComponent |
| generatePseudoRandomBlock() | Генерирует блок псевдослучайных данных, используя несколько источников. В некоторых системах это может быть немного | CSecurityManager |
| generateRandomBytes() | Генерирует строку случайных байтов. | CSecurityManager |
| generateRandomString() | Генерирует случайную строку ASCII. Генерирует только символы [0-9a-zA-z_~], которые все | CSecurityManager |
| generateSessionRandomBlock() | Получает случайные байты из источника энтропии системы через менеджер сессий PHP. | CSecurityManager |
| getEncryptionKey() | Возвращает закрытый ключ, используемый для шифрования/расшифрования данных. Если ключ не установлен явно, генерируется случайный ключ и возвращается. | CSecurityManager |
| getEventHandlers() | Возвращает список прикрепленных обработчиков событий для события. | CComponent |
| getIsInitialized() | Проверяет, был ли инициализирован этот компонент приложения. | CApplicationComponent |
| getValidation() | Этот метод устарел с версии 1.1.3. | CSecurityManager |
| getValidationKey() | Возвращает закрытый ключ, используемый для генерации HMAC. Если ключ не установлен явно, генерируется случайный ключ и возвращается. | CSecurityManager |
| hasEvent() | Определяет, определено ли событие. | CComponent |
| hasEventHandler() | Проверяет, есть ли у события прикрепленные обработчики. | CComponent |
| hasProperty() | Определяет, определено ли свойство. | CComponent |
| hashData() | Добавляет HMAC к данным. | CSecurityManager |
| init() | CSecurityManager | |
| legacyDecrypt() | Расшифровывает устаревший зашифрованный текст, который был создан старой, некорректной реализацией encrypt(). | CSecurityManager |
| maskToken() | Маскирует токен, чтобы сделать его несжимаемым. | CSecurityManager |
| raiseEvent() | Вызывает событие. | CComponent |
| setEncryptionKey() | Устанавливает ключ, используемый для шифрования/расшифрования данных. | CSecurityManager |
| setValidation() | Этот метод устарел с версии 1.1.3. | CSecurityManager |
| setValidationKey() | Устанавливает ключ, используемый для генерации HMAC. | CSecurityManager |
| unmaskToken() | Раскрывает токен, ранее замаскированный с помощью `maskToken`. | CSecurityManager |
| validateData() | Проверяет, не были ли данные изменены. | CSecurityManager |
Защищенные методы
| Метод | Описание | Определено в |
|---|---|---|
| generateRandomKey() | CSecurityManager | |
| openCryptModule() | Открывает модуль mcrypt с конфигурацией, указанной в cryptAlgorithm. | CSecurityManager |
| validateEncryptionKey() | Проверяет, является ли ключ допустимым для cryptAlgorithm. | CSecurityManager |
Подробное описание свойств
cryptAlgorithm свойство (доступно с версии v1.1.3)
public mixed $cryptAlgorithm;
имя криптографического алгоритма, который используется для шифрования и дешифрования. Он будет передан в качестве первого параметра функции mcrypt_module_open.
Этот свойство также может быть настроено как массив. В этом случае элементы массива будут переданы в качестве параметров в mcrypt_module_open. Например, array('rijndael-128', '', 'ofb', '').
По умолчанию используется AES
Примечание: MCRYPT_RIJNDAEL_192 и MCRYPT_RIJNDAEL_256 *не* соответствуют AES-192 и AES-256. Числа в константах MCRYPT_RIJNDAEL относятся к размеру блока, в то время как числа в вариантах AES относятся к длине ключа. AES — это Rijndael с размером блока 128 бит и длиной ключа 128 бит, 192 бит или 256 бит. Поэтому для использования AES в Mcrypt вам нужен MCRYPT_RIJNDAEL_128 и ключ длиной 16 байтов (AES-128), 24 байта (AES-192) или 32 байта (AES-256). Следует избегать других двух вариантов Rijndael в Mcrypt, так как они не стандартизованы и значительно меньше изучены, чем AES.
encryptionKey свойство
public string getEncryptionKey()
public void setEncryptionKey(string $value)
приватный ключ, используемый для шифрования/дешифрования данных. Если ключ не задан явно, генерируется и возвращается случайный ключ.
encryptionKeyMinimumLengths свойство
protected static array $encryptionKeyMinimumLengths;
известные минимальные длины для каждого алгоритма шифрования
hashAlgorithm свойство (доступно начиная с v1.1.3)
public string $hashAlgorithm;
название алгоритма хеширования, который используется методом computeHMAC. Список возможных алгоритмов хеширования см. в hash-algos. Обратите внимание, что если вы используете PHP 5.1.1 или ниже, вы можете использовать только 'sha1' или 'md5'.
По умолчанию используется 'sha1', то есть алгоритм SHA1.
validateEncryptionKey свойство
public boolean $validateEncryptionKey;
указывает, нужно ли проверять ключ шифрования
validation свойство
public string getValidation()
public void setValidation(string $value)
Этот метод устарел начиная с версии 1.1.3. Используйте hashAlgorithm вместо него.
validationKey свойство
public string getValidationKey()
public void setValidationKey(string $value)
приватный ключ, используемый для генерации HMAC. Если ключ не задан явно, генерируется и возвращается случайный ключ.
Подробное описание методов
compareString() метод
public boolean compareString(string $expected, string $actual) | ||
| $expected | string | строка для сравнения. |
| $actual | string | строка, введённая пользователем. |
| {return} | boolean | являются ли строки равными. |
public function compareString($expected,$actual)
{
$expected.="\0";
$actual.="\0";
$expectedLength=$this->strlen($expected);
$actualLength=$this->strlen($actual);
$diff=$expectedLength-$actualLength;
for($i=0;$i<$actualLength;$i++)
$diff|=(ord($actual[$i])^ord($expected[$i%$expectedLength]));
return $diff===0;
}
Выполняет сравнение строк с использованием подхода, устойчивого к атакам с временной зависимостью.
computeHMAC() метод
public string computeHMAC(string $data, string|null $key=NULL, string|null $hashAlgorithm=NULL) | ||
| $data | string | данные для генерации HMAC. |
| $key | string|null | приватный ключ, используемый для генерации HMAC. По умолчанию null, что означает использование значения validationKey. |
| $hashAlgorithm | string|null | название алгоритма хеширования, который используется. Список возможных алгоритмов см. в hash-algos. Если вы используете PHP 5.1.1 или ниже, можно использовать только 'sha1' или 'md5'. По умолчанию null, что означает использование значения hashAlgorithm. |
| {return} | string | HMAC для данных. |
public function computeHMAC($data,$key=null,$hashAlgorithm=null)
{
if($key===null)
$key=$this->getValidationKey();
if($hashAlgorithm===null)
$hashAlgorithm=$this->hashAlgorithm;
if(function_exists('hash_hmac'))
return hash_hmac($hashAlgorithm,$data,$key);
if(0===strcasecmp($hashAlgorithm,'sha1'))
{
$pack='H40';
$func='sha1';
}
elseif(0===strcasecmp($hashAlgorithm,'md5'))
{
$pack='H32';
$func='md5';
}
else
{
throw new CException(Yii::t('yii','Only SHA1 and MD5 hashing algorithms are supported when using PHP 5.1.1 or below.'));
}
if($this->strlen($key)>64)
$key=pack($pack,$func($key));
if($this->strlen($key)<64)
$key=str_pad($key,64,chr(0));
$key=$this->substr($key,0,64);
return $func((str_repeat(chr(0x5C), 64) ^ $key) . pack($pack, $func((str_repeat(chr(0x36), 64) ^ $key) . $data)));
}
Вычисляет HMAC для данных с использованием validationKey. Этот метод стал общедоступным начиная с версии 1.1.14.
decrypt() метод
public string decrypt(string $data, string $key=NULL) | ||
| $data | string | данные для дешифрования. |
| $key | string | ключ для дешифрования. По умолчанию null, что означает использование EncryptionKey. |
| {return} | string | дешифрованные данные |
public function decrypt($data,$key=null)
{
if($key===null)
$key=$this->getEncryptionKey();
$this->validateEncryptionKey($key);
$module=$this->openCryptModule();
$ivSize=@mcrypt_enc_get_iv_size($module);
$iv=$this->substr($data,0,$ivSize);
@mcrypt_generic_init($module,$key,$iv);
$decrypted=@mdecrypt_generic($module,$this->substr($data,$ivSize,$this->strlen($data)));
@mcrypt_generic_deinit($module);
@mcrypt_module_close($module);
return rtrim($decrypted,"\0");
}
Дешифрует данные
encrypt() метод
public string encrypt(string $data, string $key=NULL) | ||
| $data | string | данные для шифрования. |
| $key | string | ключ для шифрования. По умолчанию null, что означает использование EncryptionKey. |
| {return} | string | зашифрованные данные |
public function encrypt($data,$key=null)
{
if($key===null)
$key=$this->getEncryptionKey();
$this->validateEncryptionKey($key);
$module=$this->openCryptModule();
srand();
$iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND);
@mcrypt_generic_init($module,$key,$iv);
$encrypted=$iv.@mcrypt_generic($module,$data);
@mcrypt_generic_deinit($module);
@mcrypt_module_close($module);
return $encrypted;
}
Шифрует данные.
generatePseudoRandomBlock() метод (доступно начиная с v1.1.14)
public string generatePseudoRandomBlock() | ||
| {return} | string | строка из 64 псевдослучайных байтов. |
public function generatePseudoRandomBlock()
{
$bytes='';
if (function_exists('openssl_random_pseudo_bytes')
&& ($bytes=openssl_random_pseudo_bytes(512))!==false
&& $this->strlen($bytes)>=512)
{
return $this->substr($bytes,0,512);
}
for($i=0;$i<32;++$i)
$bytes.=pack('S',mt_rand(0,0xffff));
// On UNIX and UNIX-like operating systems the numerical values in `ps`, `uptime` and `iostat`
// ought to be fairly unpredictable. Gather the non-zero digits from those.
foreach(array('ps','uptime','iostat') as $command) {
@exec($command,$commandResult,$retVal);
if(is_array($commandResult) && !empty($commandResult) && $retVal==0)
$bytes.=preg_replace('/[^1-9]/','',implode('',$commandResult));
}
// Gather the current time's microsecond part. Note: this is only a source of entropy on
// the first call! If multiple calls are made, the entropy is only as much as the
// randomness in the time between calls.
$bytes.=$this->substr(microtime(),2,6);
// Concatenate everything gathered, mix it with sha512. hash() is part of PHP core and
// enabled by default but it can be disabled at compile time but we ignore that possibility here.
return hash('sha512',$bytes,true);
}
Генерирует блок псевдослучайных данных, используя несколько источников. В некоторых системах это может быть немного лучше, чем встроенная функция PHP mt_rand, которая не является действительно случайной.
generateRandomBytes() метод (доступно начиная с v1.1.14)
public boolean|string generateRandomBytes(integer $length, boolean $cryptographicallyStrong=true) | ||
| $length | integer | количество генерируемых случайных байтов. |
| $cryptographicallyStrong | boolean | указать, следует ли прекратить выполнение, если криптографически безопасный результат получить невозможно. Метод пытается прочитать данные из криптографически безопасного генератора псевдослучайных чисел (CS-PRNG), см. Википедия. Однако в некоторых средах выполнения PHP нет доступа к CS-PRNG, в этом случае метод возвращает false, если $cryptographicallyStrong равен true. Если $cryptographicallyStrong равен false, метод всегда возвращает псевдослучайный результат, но может использовать generatePseudoRandomBlock. Этот метод не гарантирует, что энтропия из источников, внешних для CS-PRNG, была перемешана в состояние CS-PRNG между каждым последующим вызовом. Поэтому вызывающий объект может ожидать неблокирующее поведение, в отличие, например, от чтения из /dev/random в Linux, см. Gutterman et al 2006. |
| {return} | boolean|string | сгенерированная случайная двоичная строка или false при ошибке. |
public function generateRandomBytes($length,$cryptographicallyStrong=true)
{
$bytes='';
if(function_exists('openssl_random_pseudo_bytes'))
{
$bytes=openssl_random_pseudo_bytes($length,$strong);
if($this->strlen($bytes)>=$length && ($strong || !$cryptographicallyStrong))
return $this->substr($bytes,0,$length);
}
if(function_exists('mcrypt_create_iv') &&
($bytes=@mcrypt_create_iv($length, MCRYPT_DEV_URANDOM))!==false &&
$this->strlen($bytes)>=$length)
{
return $this->substr($bytes,0,$length);
}
if(($file=@fopen('/dev/urandom','rb'))!==false &&
($bytes=@fread($file,$length))!==false &&
(fclose($file) || true) &&
$this->strlen($bytes)>=$length)
{
return $this->substr($bytes,0,$length);
}
$i=0;
while($this->strlen($bytes)<$length &&
($byte=$this->generateSessionRandomBlock())!==false &&
++$i<3)
{
$bytes.=$byte;
}
if($this->strlen($bytes)>=$length)
return $this->substr($bytes,0,$length);
if ($cryptographicallyStrong)
return false;
while($this->strlen($bytes)<$length)
$bytes.=$this->generatePseudoRandomBlock();
return $this->substr($bytes,0,$length);
}
Генерирует строку случайных байтов.
generateRandomKey() метод
protected string generateRandomKey() | ||
| {return} | string | случайно сгенерированный приватный ключ. |
protected function generateRandomKey()
{
return $this->generateRandomString(32);
}
generateRandomString() метод (доступно начиная с v1.1.14)
public string|boolean generateRandomString(integer $length, boolean $cryptographicallyStrong=true) | ||
| $length | целое число | длина генерируемой строки в символах. |
| $cryptographicallyStrong | логическое | установите в true, чтобы требовать криптографически сильную случайность. |
| {return} | строка|логическое | случайная строка или false, если она не может быть сгенерирована. |
public function generateRandomString($length,$cryptographicallyStrong=true)
{
if(($randomBytes=$this->generateRandomBytes($length+2,$cryptographicallyStrong))!==false)
return strtr($this->substr(base64_encode($randomBytes),0,$length),array('+'=>'_','/'=>'~'));
return false;
}
Генерирует случайную строку ASCII. Генерирует только символы [0-9a-zA-z_~], которые все прозрачны в кодировании URL.
generateSessionRandomBlock() метод (доступен начиная с версии v1.1.14)
public boolean|string generateSessionRandomBlock() | ||
| {return} | логическое|строка | 20-байтовая случайная двоичная строка или false при ошибке. |
public function generateSessionRandomBlock()
{
ini_set('session.entropy_length',20);
if(ini_get('session.entropy_length')!=20)
return false;
// These calls are (supposed to be, according to PHP manual) safe even if
// there is already an active session for the calling script.
@session_start();
@session_regenerate_id();
$bytes=session_id();
if(!$bytes)
return false;
// $bytes has 20 bytes of entropy but the session manager converts the binary
// random bytes into something readable. We have to convert that back.
// SHA-1 should do it without losing entropy.
return sha1($bytes,true);
}
Получает случайные байты из источника энтропии системы через менеджер PHP сессий.
getEncryptionKey() метод
public string getEncryptionKey() | ||
| {return} | строка | приватный ключ, используемый для шифрования/дешифрования данных. Если ключ не задан явно, генерируется случайный и возвращается. |
public function getEncryptionKey()
{
if($this->_encryptionKey!==null)
return $this->_encryptionKey;
else
{
if(($key=Yii::app()->getGlobalState(self::STATE_ENCRYPTION_KEY))!==null)
$this->setEncryptionKey($key);
else
{
if(($key=$this->generateRandomString(32,true))===false)
if(($key=$this->generateRandomString(32,false))===false)
throw new CException(Yii::t('yii',
'CSecurityManager::generateRandomString() cannot generate random string in the current environment.'));
$this->setEncryptionKey($key);
Yii::app()->setGlobalState(self::STATE_ENCRYPTION_KEY,$key);
}
return $this->_encryptionKey;
}
}
getValidation() метод
public string getValidation() | ||
| {return} | строка | - |
public function getValidation()
{
return $this->hashAlgorithm;
}
Этот метод устарел с версии 1.1.3. Используйте hashAlgorithm вместо него.
getValidationKey() метод
public string getValidationKey() | ||
| {return} | строка | приватный ключ, используемый для генерации HMAC. Если ключ не задан явно, генерируется случайный и возвращается. |
public function getValidationKey()
{
if($this->_validationKey!==null)
return $this->_validationKey;
else
{
if(($key=Yii::app()->getGlobalState(self::STATE_VALIDATION_KEY))!==null)
$this->setValidationKey($key);
else
{
if(($key=$this->generateRandomString(32,true))===false)
if(($key=$this->generateRandomString(32,false))===false)
throw new CException(Yii::t('yii',
'CSecurityManager::generateRandomString() cannot generate random string in the current environment.'));
$this->setValidationKey($key);
Yii::app()->setGlobalState(self::STATE_VALIDATION_KEY,$key);
}
return $this->_validationKey;
}
}
hashData() метод
public string hashData(string $data, string $key=NULL) | ||
| $data | строка | данные, которые необходимо хешировать. |
| $key | строка | приватный ключ, используемый для генерации HMAC. По умолчанию null, что означает использование validationKey. |
| {return} | строка | данные с префиксом HMAC |
public function hashData($data,$key=null)
{
return $this->computeHMAC($data,$key).$data;
}
Добавляет префикс HMAC к данным.
init() метод
public void init() |
public function init()
{
parent::init();
$this->_mbstring=extension_loaded('mbstring');
}
legacyDecrypt() метод
public string legacyDecrypt(string $data, string $key=NULL, string|array $cipher='des') | ||
| $data | строка | данные, которые необходимо дешифровать. |
| $key | строка | ключ для дешифрования. По умолчанию null, что означает, что ключ должен быть загружен из постоянного хранилища. |
| $cipher | строка|массив | алгоритм, который необходимо использовать |
| {return} | строка | дешифрованные данные |
public function legacyDecrypt($data,$key=null,$cipher='des')
{
if (!$key)
{
$key=Yii::app()->getGlobalState(self::STATE_ENCRYPTION_KEY);
if(!$key)
throw new CException(Yii::t('yii','No encryption key specified.'));
$key = md5($key);
}
if(extension_loaded('mcrypt'))
{
if(is_array($cipher))
$module=@call_user_func_array('mcrypt_module_open',$cipher);
else
$module=@mcrypt_module_open($cipher,'', MCRYPT_MODE_CBC,'');
if($module===false)
throw new CException(Yii::t('yii','Failed to initialize the mcrypt module.'));
}
else
throw new CException(Yii::t('yii','CSecurityManager requires PHP mcrypt extension to be loaded in order to use data encryption feature.'));
$derivedKey=$this->substr($key,0,@mcrypt_enc_get_key_size($module));
$ivSize=@mcrypt_enc_get_iv_size($module);
$iv=$this->substr($data,0,$ivSize);
@mcrypt_generic_init($module,$derivedKey,$iv);
$decrypted=@mdecrypt_generic($module,$this->substr($data,$ivSize,$this->strlen($data)));
@mcrypt_generic_deinit($module);
@mcrypt_module_close($module);
return rtrim($decrypted,"\0");
}
Дешифрует устаревший шифр, который был создан старой, нерабочей реализацией encrypt().
maskToken() метод (доступен начиная с версии v1.1.18)
public string maskToken(string $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->generateRandomString($this->strlen($token));
return strtr(base64_encode($mask.($mask^$token)),'+/','-_');
}
Замаскирует токен, чтобы сделать его несжимаемым. Применяет случайную маску к токену и добавляет использованную маску к результату, что делает строку всегда уникальной. Используется для смягчения атаки BREACH, случайным образом изменяя токен на каждом запросе.
openCryptModule() метод (доступен начиная с версии v1.1.3)
protected resource openCryptModule() | ||
| {return} | ресурс | дескриптор модуля mycrypt. |
protected function openCryptModule()
{
if(extension_loaded('mcrypt'))
{
if(is_array($this->cryptAlgorithm))
$module=@call_user_func_array('mcrypt_module_open',$this->cryptAlgorithm);
else
$module=@mcrypt_module_open($this->cryptAlgorithm,'', MCRYPT_MODE_CBC,'');
if($module===false)
throw new CException(Yii::t('yii','Failed to initialize the mcrypt module.'));
return $module;
}
else
throw new CException(Yii::t('yii','CSecurityManager requires PHP mcrypt extension to be loaded in order to use data encryption feature.'));
}
Открывает модуль mcrypt с конфигурацией, указанной в cryptAlgorithm.
setEncryptionKey() метод
public void setEncryptionKey(string $value) | ||
| $value | строка | ключ, используемый для шифрования/дешифрования данных. |
public function setEncryptionKey($value)
{
$this->validateEncryptionKey($value);
$this->_encryptionKey=$value;
}
setValidation() метод
public void setValidation(string $value) | ||
| $value | строка | - |
public function setValidation($value)
{
$this->hashAlgorithm=$value;
}
Этот метод устарел с версии 1.1.3. Используйте hashAlgorithm вместо него.
setValidationKey() метод
public void setValidationKey(string $value) | ||
| $value | строка | ключ, используемый для генерации HMAC |
public function setValidationKey($value)
{
if(!empty($value))
$this->_validationKey=$value;
else
throw new CException(Yii::t('yii','CSecurityManager.validationKey cannot be empty.'));
}
unmaskToken() метод (доступен начиная с версии v1.1.18)
public string unmaskToken(string $maskedToken) | ||
| $maskedToken | строка | Замаскированный токен. |
| {return} | строка | Размаскированный токен или пустая строка в случае, если формат токена недействителен. |
public function unmaskToken($maskedToken)
{
$decoded=base64_decode(strtr($maskedToken,'-_','+/'));
$length=$this->strlen($decoded)/2;
// Check if the masked token has an even length.
if(!is_int($length))
return '';
return $this->substr($decoded,$length,$length)^$this->substr($decoded,0,$length);
}
Размаскирует токен, ранее замаскированный методом `maskToken`.
validateData() метод
public string validateData(string $data, string $key=NULL) | ||
| $data | строка | данные, которые необходимо валидировать. Данные должны быть предварительно сгенерированы с помощью hashData(). |
| $key | строка | приватный ключ, используемый для генерации HMAC. По умолчанию null, что означает использование validationKey. |
| {return} | строка | реальные данные с удалённым HMAC. False, если данные изменены. |
public function validateData($data,$key=null)
{
if (!is_string($data))
return false;
$len=$this->strlen($this->computeHMAC('test'));
if($this->strlen($data)>=$len)
{
$hmac=$this->substr($data,0,$len);
$data2=$this->substr($data,$len,$this->strlen($data));
return $this->compareString($hmac,$this->computeHMAC($data2,$key))?$data2:false;
}
else
return false;
}
Проверяет, были ли данные изменены.
validateEncryptionKey() метод
protected boolean validateEncryptionKey(string $key) | ||
| $key | строка | ключ для проверки |
| {return} | булево | результат проверки |
protected function validateEncryptionKey($key)
{
if(is_string($key))
{
$cryptAlgorithm = is_array($this->cryptAlgorithm) ? $this->cryptAlgorithm[0] : $this->cryptAlgorithm;
$supportedKeyLengths=@mcrypt_module_get_supported_key_sizes($cryptAlgorithm);
if($supportedKeyLengths)
{
if(!in_array($this->strlen($key),$supportedKeyLengths)) {
throw new CException(Yii::t('yii','Encryption key length can be {keyLengths}.',array('{keyLengths}'=>implode(',',$supportedKeyLengths))));
}
}
elseif(isset(self::$encryptionKeyMinimumLengths[$cryptAlgorithm]))
{
$minLength=self::$encryptionKeyMinimumLengths[$cryptAlgorithm];
$maxLength=@mcrypt_module_get_algo_key_size($cryptAlgorithm);
if($this->strlen($key)<$minLength || $this->strlen($key)>$maxLength)
throw new CException(Yii::t('yii','Encryption key length must be between {minLength} and {maxLength}.',array('{minLength}'=>$minLength,'{maxLength}'=>$maxLength)));
}
else
throw new CException(Yii::t('yii','Failed to validate key. Supported key lengths of cipher not known.'));
}
else
throw new CException(Yii::t('yii','Encryption key should be a string.'));
}
Проверяет, является ли ключ допустимым для cryptAlgorithm.
© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CSecurityManager