Laravel — DecryptException: «MAC неверен»

В laravel для регистрации я использую алгоритм шифрования для пароля вместо встроенной функции bcrypt в Laravel, потому что получить пароль и отправить его на почту, когда пароль забыт.

Но расшифровывать это показывает ошибку как

DecryptException The MAC is invalid in Encrypter.php (line 184)

Это, когда я запускаю этот код, он работает на локальном сервере, но сам сервер не работает ниже, я упомянул код, может кто-нибудь, пожалуйста, помогите

public function forgotpassword(Request $request)
{
$email=$request->email;
$selectemail = User::select('email','password','name')
->where('email',$email)
->first();

if($selectemail)
{
$password=decrypt($selectemail->password);
$data = array( 'email' => $selectemail->email,'password' => $password , 'name' => $selectemail->name);

Mail::send('email.resetpassword',$data,function($message) use ($email)
{
$message->to([$email])->subject('Forgot Password Letgo');
});
echo "Mail has sent successfully";
} else {
echo "This email is not yet registered";
}
}

5

Решение

Проблема в том, что вы сгенерировали новый APP_KEY, тогда, если вы попытаетесь расшифровать старые зашифрованные данные, он покажет DecryptException: The MAC is invalid,

Если вы хотите расшифровать старые данные, вам нужно восстановить старый APP_KEY.

После осознания этого теперь добавьте новую проблему, если вы сохранили новые данные с помощью другого APP_KEY или другого метода шифрования, у вас возникнут проблемы с данными, поскольку они смешаны в таблице.

В случае, если вы не знаете, когда вы начали с новым методом шифрования или дифференцируете новые зашифрованные записи, самым быстрым решением будет сброс всех паролей с помощью нового метода шифрования.

Вы можете узнать больше о том, как шифрование Laravel работает на официальном Laravel docs.

15

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

Чтобы избежать этого, используйте вместо этого пользовательский ключ. Ключ по умолчанию — APP_KEY, но вы можете указать его, чтобы ваш расшифровыватель не был связан с новым или старым APP_KEY.
Я использую следующий код, чтобы решить его, и он работал в разных APP_KEYs.

function customCrypt($vWord){
$customKey = "blabla_key_with_correct_length";
$newEncrypter = new \Illuminate\Encryption\Encrypter( $customKey, Config::get( 'app.cipher' ) );
return $newEncrypter->encrypt( $vWord );
}

function customDecrypt($vWord){
$customKey = "blabla_key_with_correct_length";
$newEncrypter = new \Illuminate\Encryption\Encrypter( $customKey, Config::get( 'app.cipher' ) );
return $newEncrypter->decrypt( $vWord );
}

Важно для длины ключа : если $ cipher == ‘AES-128-CBC’ использует $ length === 16, если $ cipher == ‘AES-256-CBC’ использует $ length === 32). Регистрироваться config/app.cipher какой шифр использует ваше приложение.

1

Я скопировал APP_KEY из окружающей среды это работало DEV к производство и проблема была решена. Вы можете попробовать это.

1

Ключ приложения имеет значение при шифровании и дешифровании. У меня было 2 саба
домены с разными проектами, в которых я шифровал значение на сабе
домен и 1 и пытается расшифровать на поддомен 2. Проблема была решена
когда оба проекта имели один и тот же appkey. Примечание: проекты не должны
есть тот же appkey !!!

Если вы импортировали БД из одной среды в другую, скорее всего, вы столкнетесь с этой ошибкой. Рекомендуется использовать тот же APP_KEY, что и в приложении источника данных, чтобы исправить ошибку.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector