Когда мы делаем программу, шифрование и дешифрование являются незаменимой темой. Когда мы используем yii2 для разработки приложений, какова встроенная поддержка шифрования и дешифрования (безопасность)? Эта статья будет открыта для вас.
Связанная с этим среда
- Операционная система и IDE macOS 10.13.1 и PhpStorm 2018.1.2
- Версия программного обеспечения PHP 7.1.8 Yii 2.0.14
В yii2 библиотека, управляющая шифрованием и дешифрованием, называется Безопасностью, которая существует в виде компонентов yii2, поэтому вы можете получить и использовать ее через Yii:: $app – > безопасность.
Расположение исходного кода компонента безопасности выглядит следующим образом
vendor/yiisoft/yii2/base/Security.php
Компонент безопасности содержит 15 распространенных методов, связанных с шифрованием и дешифрованием (и кодированием), поэтому давайте начнем со списка.
- Шифрование пароля
- EncryptByKey
- расшифровать По Паролю
- Расшифровывайкей
- hkdf
- pbkdf2
- Хэш-данные
- проверка Данных
- Генерирующий ключ
- Генерирующая строка
- Сгенерировать пароль
- Пароль для подтверждения
- сравнить Строку
- маскТокен
- маркер разоблачения
Я думаю, вы не видели некоторых из них. Все в порядке. Давайте познакомимся с ними поближе.
Генерирующая строка
Почему ты говоришь это первым? generateRandomString Потому что это наиболее часто используемое, по крайней мере, я так делаю.
public function generateRandomString($length = 32){...}Создайте случайную строку с параметром $length, представляющим длину строки по умолчанию 32 бита. Стоит отметить, что диапазон значений этой строки равен [A-Za-z0-9_-].
Сгенерировать пароль и подтвердить пароль
Хэш пароля Gene e и пароль проверки подлинности часто используются для шифрования паролей пользователей и проверки правильности паролей. Поскольку MD5 может столкнуться, когда мы разрабатываем приложения с помощью yii2, функция generatePasswordHash является предпочтительной функцией для шифрования паролей. Он вызывает функцию crypt.
Общее использование выглядит следующим образом
// Use generatePasswordHash to encrypt the user's password, $hash is stored in the library
$hash = Yii::$app->getSecurity()->generatePasswordHash($password);
// Validate passwords using validatePassword
if(Yii::$app->getSecurity()->validatePassword($password, $hash)){
// Correct password
}else{
// Password error
}Генерирующий ключ
и generateRandomString Аналогично, по умолчанию генерируется случайная строка длиной 32 бита. Разница в том, что generateRandomKey ASCII не генерируется.
Проще говоря generateRandomString Примерно равно base64_encode( generateRandomKey )。
Шифрование пароля и расшифровка пароля
Функция кодирования и декодирования использует секретный ключ для кодирования данных, а затем декодирует данные кодирования с помощью секретного ключа.
Пример
$dat = Yii::$app->security->encryptByPassword("hello","3166886");
echo Yii::$app->security->encryptByPassword($dat,"3166886");// helloСледует отметить, что данные кодирования, полученные выше, не являются ASCII и могут быть завернуты под внешний слой с помощью base64_encode и base64_decode.
Шифрование и дешифрование
Это также набор функций кодирования и декодирования, которые работают быстрее, чем при использовании паролей. Функция объявляется как
public function encryptByKey($data, $inputKey, $info = null){}
public function decryptByKey($data, $inputKey, $info = null){}В EncryptByKey и DecryptByKey есть третий параметр, например, мы можем передать идентификатор участника, поэтому эта информация будет использоваться вместе с $inputKey в качестве ключа для шифрования и дешифрования.
hkdf
Стандартный алгоритм HKDF используется для получения ключа из заданного входного ключа. Метод hash_hkdf используется в PHP 7+, а метод hash_hmac используется в PHP 7+.
pbkdf2
Стандартный алгоритм PBKDF2 используется для получения ключа из заданного пароля. Этот метод может быть использован для криптографического шифрования, но yii2 имеет лучшую криптографическую схему generatePasswordHash 。
Хэш-данные и проверка данных
Иногда, чтобы предотвратить вмешательство в содержимое, нам необходимо пометить данные, хэш-данные и проверить данные-это комбинация этой задачи.
хэш-данные Используются для необработанных данных Adddataprefix Например, следующий код
$result = Yii::$app->security->hashData("hello",'123456',false);
// ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhelloВы видите дополнительный набор символов перед hello, который будет отличаться в зависимости от исходных данных. Поэтому мы сделали специальную защищенную от несанкционированного доступа метку для данных, а затем включили проверку данных.
Примечание: Третий параметр хэш-данных указывает, находится ли сгенерированное хэш-значение в исходном двоичном формате. ложь Генерируется шестнадцатеричное число в нижнем регистре.
проверка данных Проверьте данные, к которым был добавлен следующий код
$result = Yii::$app->security->validateData("ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhello",'123456',false);
// helloЕсли возвращается исходная строка, проверка проходит, в противном случае возвращается подделка.
Следует использовать третий параметр функции validateData HashData() Значения при генерации данных совпадают. Он указывает, находятся ли хэш-значения в данных в двоичном формате. Если да? false Значение хэша состоит только из шестнадцатеричных цифр в нижнем регистре. Генерируются шестнадцатеричные цифры.
сравнить Строку
Сравнения строк, предотвращающие временные атаки, очень просты в использовании.
Yii::$app->security->compareString("abc",'abc');Если результат верен, он будет равен, в противном случае он не будет равен.
Так что же такое последовательная атака? Позвольте мне привести вам простой пример.
if($code == Yii::$app->request->get('code')){
}В приведенной выше логике сравнения две строки сравниваются одна за другой с первого места и немедленно возвращают значение false, если они отличаются. Затем, рассчитав скорость возврата, мы можем узнать, какой из них начинает отличаться, тем самым реализуя сцену побитовой расшифровки, которая часто происходит в фильмах.
Сравнивая две строки с помощью CompareString, независимо от того, равны строки или нет, время, затрачиваемое функцией, остается постоянным, что может эффективно предотвращать временные атаки.
маскТокен и& Разоблачение масктокена
Маркер маски используется для сокрытия реального маркера и не может быть сжат. Один и тот же токен в конечном итоге генерирует разные случайные токены. В функции CSRF yii2 используется маркер маски. Принцип не сложен. Давайте посмотрим на исходный код.
public function maskToken($token){
$mask = $this->generateRandomKey(StringHelper::byteLength($token));
return StringHelper::base64UrlEncode($mask . ($mask ^ $token));
}Также ясна цель разоблачения масктокена, которая используется для получения токена, скрытого Масктокеном.
Далее давайте рассмотрим пример кода
$token = Yii::$app->security->maskToken("123456");
Echo Yii: $app - > Security - > unmaskToken ($token); // The result is 123456Наконец, давайте закончим.
- Шифрование/дешифрование: EncryptByKey (), DecryptByKey (), encryptByPassword () и расшифровка паролем ();
- Вывод ключа с использованием стандартных алгоритмов: pbkdf2 () и hkdf ();
- Чтобы предотвратить подделку данных: хэш-данные () и проверка данных ();
- Проверка пароля: generatePasswordHash () и validatePassword ()
Больше оригинальных статей Yii