Как обращаться с ключом AES в Symfony - PullRequest
0 голосов
/ 07 июня 2018

Я разрабатываю веб-приложение с использованием Symfony 3.4 с PHP 7.2 и базой данных SQLite.

Я хочу зашифровать некоторые поля своей сущности с помощью AES-256 с использованием стандартных библиотек - openssl илиodium - но яЯ действительно не уверен, как правильно это сделать, поэтому я прошу у вас совета, прежде чем я сделаю много больших ужасных ошибок:

  1. Каковы лучшие практики для хранения ключей и IV?
  2. это уместно, когда я помещаю его, если он не доступен через веб-браузер?Я думаю, чтобы поместить их в config.yml, но он чувствует себя неправильно, очень неправильно
  3. какая библиотека более безопасна между openssl и натрия?

1 Ответ

0 голосов
/ 08 июня 2018

Я использую следующий код, где мой секрет хранится в файле parameters.yml, поэтому он не будет виден, если вы отправите его в Git.

/**
 * SecurityHelper.
 *
 * @author Kengy Van Hijfte <development@kengy.be>
 */
class SecurityHelper
{
    /** @var  string $secret */
    private $secret;

    public function __construct($secret)
    {
        $this->secret = $secret;
    }

    /**
     * @param $text
     * @return string
     */
    public function encrypt($text)
    {
        if (null == $text)
            return null;

        // Generate an initialization vector
        $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
        // Encrypt the data using AES 256 encryption in CBC mode using our encryption key and initialization vector.
        $encrypted = openssl_encrypt($text, 'aes-256-cbc', $this->secret, 0, $iv);
        // The $iv is just as important as the key for decrypting, so save it with our encrypted data using a unique separator (::)
        return base64_encode($encrypted . '::' . $iv);
    }

    /**
     * @param $text
     * @return string
     */
    public function decrypt($text)
    {
        if (null == $text)
            return null;

        // To decrypt, split the encrypted data from our IV - our unique separator used was "::"
        list($encrypted_data, $iv) = explode('::', base64_decode($text), 2);
        return openssl_decrypt($encrypted_data, 'aes-256-cbc', $this->secret, 0, $iv);
    }
}
...