Ошибка при попытке сохранить зашифрованную строку в Laravel

Я реализую алгоритм обратимого шифрования на основе примера в http://www.edzynda.com/create-a-self-destructing-encrypted-message-app-in-laravel-part-1/

Я поместил код в функцию события модели:

public static function boot()
{
parent::boot();

// Setup event bindings...

static::creating(function($account)
{
/* encrypt password and save iv */
$encryption = self::encrypt($account->db_password);  // or: Input::get('db_password')
$account->db_password = $encryption['encrypted_string'];
$account->iv = $encryption['iv'];

Log::debug($account);

//print_r ($encryption);

});}

public static function encrypt($string)
{
// Generate an IV
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);// Encrypt the string
$encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $_ENV['ACCOUNT_KEY'], $string, MCRYPT_MODE_CFB, $iv);

return ['encrypted_string' => $encrypted_string, 'iv' => $iv];
}

В моем сеансе базы данных я вызываю Model :: create, чтобы строка была зашифрована перед сохранением. Это называется из моих тестов. Тем не менее, я получаю

  [ErrorException]
json_encode(): Invalid UTF-8 sequence in argument

Я убедился, что тип столбца является двоичным.

Дополнительная информация: когда я выполняю mb_detect_encoding для любого значения ($ iv или $ string), я получаю либо UTF-8, либо ничего, я полагаю, это зависит не от случайных символов, которые появляются в результате.

0

Решение

Мое решение: для хранения и транспортировки зашифрованная строка и IV должны быть закодированы в base64.

Соответствующая строка выше изменена на:

return [
'encrypted_string' => base64_encode($encrypted_string),
'iv' => base64_encode($iv)
];

и, конечно, base64_decode необходимо использовать перед расшифровкой строки с сохраненным значением IV.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]