Рубрики
Uncategorized

Шифрование и расшифровка yii2

Автор оригинала: David Wong.

Когда мы делаем программу, шифрование и дешифрование являются незаменимой темой. Когда мы используем 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 распространенных методов, связанных с шифрованием и дешифрованием (и кодированием), поэтому давайте начнем со списка.

  1. Шифрование пароля
  2. EncryptByKey
  3. расшифровать По Паролю
  4. Расшифровывайкей
  5. hkdf
  6. pbkdf2
  7. Хэш-данные
  8. проверка Данных
  9. Генерирующий ключ
  10. Генерирующая строка
  11. Сгенерировать пароль
  12. Пароль для подтверждения
  13. сравнить Строку
  14. маскТокен
  15. маркер разоблачения

Я думаю, вы не видели некоторых из них. Все в порядке. Давайте познакомимся с ними поближе.

Генерирующая строка

Почему ты говоришь это первым? 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