Spec-Zone.ru › Yii 1.1

CSecurityManager

Пакет system.base
Наследование class CSecurityManager » CApplicationComponent » CComponent
Реализует IApplicationComponent
С момента 1.0
Исходный код framework/base/CSecurityManager.php
CSecurityManager предоставляет функции для работы с закрытыми ключами, хэширования и шифрования.

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 являются ли строки равными.
Исходный код: framework/base/CSecurityManager.php#606 (показать)
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;
}

Выполняет сравнение строк с использованием подхода, устойчивого к атакам с временной зависимостью.

См. также

  • http://codereview.stackexchange.com/questions/13512

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 для данных.
Исходный код: framework/base/CSecurityManager.php#327 (показать)
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 дешифрованные данные
Исходный код: framework/base/CSecurityManager.php#240 (показать)
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 зашифрованные данные
Исходный код: framework/base/CSecurityManager.php#218 (показать)
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 псевдослучайных байтов.
Исходный код: framework/base/CSecurityManager.php#440 (показать)
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 при ошибке.
Исходный код: framework/base/CSecurityManager.php#391 (показать)
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 случайно сгенерированный приватный ключ.
Исходный код: framework/base/CSecurityManager.php#110 (показать)
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, если она не может быть сгенерирована.
Исходный код: framework/base/CSecurityManager.php#367 (показать)
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 при ошибке.
Исходный код: framework/base/CSecurityManager.php#477 (показать)
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} строка приватный ключ, используемый для шифрования/дешифрования данных. Если ключ не задан явно, генерируется случайный и возвращается.
Исходный код: framework/base/CSecurityManager.php#158 (показать)
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} строка -
Исходный код: framework/base/CSecurityManager.php#195 (показать)
public function getValidation()
{
    return 
$this->hashAlgorithm;
}

Этот метод устарел с версии 1.1.3. Используйте hashAlgorithm вместо него.

getValidationKey() метод

public string getValidationKey()
{return} строка приватный ключ, используемый для генерации HMAC. Если ключ не задан явно, генерируется случайный и возвращается.
Исходный код: framework/base/CSecurityManager.php#120 (показать)
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
Исходный код: framework/base/CSecurityManager.php#285 (показать)
public function hashData($data,$key=null)
{
    return 
$this->computeHMAC($data,$key).$data;
}

Добавляет префикс HMAC к данным.

init() метод

public void init()
Исходный код: framework/base/CSecurityManager.php#100 (показать)
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} строка дешифрованные данные
Исходный код: framework/base/CSecurityManager.php#566 (показать)
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} строка Замаскированный токен.
Исходный код: framework/base/CSecurityManager.php#626 (показать)
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.
Исходный код: framework/base/CSecurityManager.php#261 (показать)
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 строка ключ, используемый для шифрования/дешифрования данных.
Исходный код: framework/base/CSecurityManager.php#183 (показать)
public function setEncryptionKey($value)
{
    
$this->validateEncryptionKey($value);
    
$this->_encryptionKey=$value;
}

setValidation() метод

public void setValidation(string $value)
$value строка -
Исходный код: framework/base/CSecurityManager.php#206 (показать)
public function setValidation($value)
{
    
$this->hashAlgorithm=$value;
}

Этот метод устарел с версии 1.1.3. Используйте hashAlgorithm вместо него.

setValidationKey() метод

public void setValidationKey(string $value)
$value строка ключ, используемый для генерации HMAC
Исходный код: framework/base/CSecurityManager.php#145 (показать)
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} строка Размаскированный токен или пустая строка в случае, если формат токена недействителен.
Исходный код: framework/base/CSecurityManager.php#639 (показать)
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, если данные изменены.
Исходный код: framework/base/CSecurityManager.php#298 (показать)
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} булево результат проверки
Исходный код: framework/base/CSecurityManager.php#528 (показать)
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API