2015-09-23 2 views
7

Ранее Laravel использует шифр MCRYPT_RIJNDAEL_128 для шифрования (в < 5.0). Теперь это AES-256-CBC (> = 5.1). Mcrypt, похоже, abandonware и we should not use it.Изменение шифрования в шифровании Laravel

У меня есть приложение, написанное для Laravel < 5.1 и перенесенное в Laravel 5.1. Могу ли я изменить шифр, или он сломает все?

EDIT:

Другими словами, я могу перейти от MCRYPT_RIJNDAEL_128 к AES-256-CBC в приложении производства Laravel с населенной базы данных, подключенных пользователей и т.д. без прерывания обслуживания/деградации или ошибка?

+0

'MCRYPT_RIJNDAEL_128' - это AES, поэтому он также может быть« AES-256-CBC ». Можете быть более конкретными? –

+0

Хорошо, я просто старался быть более точным (я не знаю, где именно шифрование используется Laravel), надеюсь, что сейчас достаточно ясно (извините, если нет) –

ответ

3

Да, вы можете это сделать. Единственный «встроенный» побочный эффект должен заключаться в том, что ваши пользователи выходят из системы.

Я говорю «встроенный», потому что если у вас есть что-то еще, использующее этот ключ шифрования (запуск криптографических/дешифрованных данных в ваших db, токенах api/auth и т. Д.), Тогда вам нужно будет выяснить, как перенести эти также.

+0

Будут ли работать пароли после смены шифрования? Поскольку они хранятся хэшированные в базе данных, и если есть новый шифр encyption, будет ли он давать другой результат encypted password, так что old_encypted_password! = New_encypted_password? – user991

+0

Извините за поздний ответ, но я только что увидел это ... - Да, пароли будут работать после изменения ключа шифрования, потому что по умолчанию laravel использует стандартные методы хэширования пароля php, которые используют bcrypt.Bcrypt хэш, который не может быть расшифрован, и его соль содержится в строке пароля. Вы можете изменить шифр, не влияя на существующие пароли (пока вы не сделали что-то вручную с шифрованием). –

2

Я просто попытался его в запущенном приложении, и по крайней мере, он выбрасывает исключения для пользователей, которые уже имеют Cookies/Sessions и когда вы используете «шифровать» => верно в конфигурационном/sessions.php (который отключен по умолчанию).

ErrorException в Encrypter.php линии 101: openssl_decrypt(): IV прошло имеет длину 32 байт, который длиннее, чем 16, ожидаемый выбранным шифра, усечения

Редактировать: Это может быть исправлено путем редактирование приложение/Http/Промежуточный/EncryptCookies.php и добавить эту функцию:

protected function decrypt(Request $request) 
{ 
    foreach ($request->cookies as $key => $c) { 
     if ($this->isDisabled($key)) { 
      continue; 
     } 

     try { 
      $request->cookies->set($key, $this->decryptCookie($c)); 
     } catch (\Illuminate\Contracts\Encryption\DecryptException $e) { 
      $request->cookies->set($key, null); 
     } catch (\ErrorException $e) { 
      $request->cookies->set($key, null); 
     } 
    } 

    return $request; 
} 

Это удалит куки, которые не могут быть расшифрованы, поэтому в основном он регистрирует пользователь вне.

+0

эй спасибо, это полностью спасло меня сегодня. – nsbucky

0

Это совершенно безопасно перейти от MCRYPT_RIJNDAEL_128 к 'AES-256-CBC'

Как я тестировал?

First I encrypted text with MCRYPT_RIJNDAEL_128 
After that, I changed cipher to 'AES-256-CBC' in config/app.php 
Third I decrypted encrypted string from the first step 

I also tested that logged in users stay logged after cipher change 

Таким образом, можно с уверенностью сказать, что смена шифрования не повлияет на вас.

Примечание: при обновлении до версии PHP 7.1 или PHP 7.2 вы можете получить «Предупреждение: использование неопределенной константы MCRYPT_RIJNDAEL_128». Вот когда я увидел, что мне нужно изменить шифр.

Смежные вопросы