php Laravel -解密异常:'MAC无效'

gajydyqb  于 2023-01-16  发布在  PHP
关注(0)|答案(7)|浏览(215)

在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";
  }             
}
afdcj2ne

afdcj2ne1#

问题是您生成了一个新的APP_KEY,然后如果您尝试解密旧的加密数据,它将显示DecryptException: The MAC is invalid
如果你想解密旧数据,你需要恢复你的旧APP_KEY.
在意识到这一点之后,现在又增加了一个新的问题,如果使用另一个APP_KEY或另一种加密方法存储新数据,则数据会出现问题,因为它们在表中混合在一起。
如果你不知道什么时候开始使用新的加密方法或区分新的加密条目,最快的解决方案是使用新的加密方法重置所有密码。
您可以了解有关Laravel加密如何在官方Laravel docs上工作的更多信息。

vtwuwzda

vtwuwzda2#

我将APP_KEY从它工作的环境dev复制到production,问题解决了。您可能想尝试一下。

hc8w905p

hc8w905p3#

如果以上这些都没有帮助到你,就像我的情况一样,那么,有些人提到清除cookie,可悲的是,至少可以说这是模棱两可的。
我尝试了上面的一切,清除缓存在laravel和浏览器,硬重新加载和所有..没有成功!
解决方案:完全关闭浏览器,然后重新打开。在我的例子中,我同时使用Chrome和Opera,它们都很混乱。我不得不同时关闭它们,然后重新打开它们,Mac的问题才消失。

tyky79it

tyky79it4#

为了避免这种情况,请使用自定义密钥。默认密钥是APP_KEY,但您可以提供一个密钥,这样您的解密就不会与新的或旧的APP_KEY链接。我使用以下代码来解决它,它在不同的APP_KEY中工作。

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中检查您的应用使用的密码。

pgx2nnw8

pgx2nnw85#

应用密钥在加密和解密中很重要。我有2个子域,它们具有不同的项目,我在子域1上加密值,并尝试在子域2上解密。当两个项目具有相同的应用密钥时,问题得到解决。注意:任何项目都不应具有相同的appkey!!!
如果您已经将DB从一个环境导入到另一个环境中,则很可能会遇到此错误。建议使用与数据源应用程序相同的APP_KEY来修复错误。

yvt65v4c

yvt65v4c6#

如果您运行多个项目,并将一个加密密钥传递到另一个项目,只需确保您已将相同的APP_KEY到您的两个项目.

hsgswve4

hsgswve47#

如果您在同一个浏览器中本地运行了2个不同的Laravel应用程序,Cookie可以保存在您的浏览器中。请在加载2n应用程序之前清除该高速缓存和Cookie。

相关问题