menu 萌音云笔记 广场
account_circle
官网 会员 color_lens
check_circle
登录后即可查阅
keyboard_arrow_down
阿珏
我是管理员
laravel项目报错DecryptException:The MAC is invalid.
2020-02-03 11:56:20

在 Laravel 项目完成部署到服务器、数据库导入成功后: 登录报错DecryptException:The MAC is invalid.

原因是 Laravel 的 APP_KEY 和 encrypt() 函数加密的问题。(encrypt() 是 Laravel 的助手函数,相当于 Crypt::encrypt() 的简写形式)

一旦用 php artisan key:generate 重新生成了APP_KEY,在 desrypt() 函数解密时会报 The MAC is invalid 异常,这是由于 APP_KEY 变化导致 MAC 信息发生了变化,decrypt() 解密就报了异常。

 

解决方法:

方法1、重新用 encrypt() 进行加密,后台重新登录,OK。

方法2、encrypt() 加密不太利于项目移植和部署,使用哈希加密。


1.问题描述

把Laravel项目上传至服务器,本地数据库导出再导入至服务器数据库,一切运行正常,但是当进行用户登录时报错

DecryptException in compiled.php line 13238: The MAC is invalid

DecryptException in BaseEncrypter.php line 48: The MAC is invalid



2.解决过程


上网查询发现很多人说是laravel的key问题,要重新生成一下,清除缓存。但是试过发现错误由
DecryptException in compiled.php line 13238: The MAC is invalid
变成了
DecryptException in BaseEncrypter.php line 48: The MAC is invalid

问题还是没有解决

然后在技术群里询问,有人说把数据库里的数据在服务器端重新encrypt生成一遍导入数据库,可能是因为Laravel中的encrypt函数和计算机的mac地址进行了绑定,
重新清掉了服务器数据库里的用户表,然后用seeder重新填充数据,再次调试发现问题解决。



对比本地数据库中经过encrypt加密的用户密码和服务器数据库中的,发现同样的密码生成的加密数据却不一样,证明encrypt加密和环境有关,翻阅手册发现有对加密的介绍。
设置:

在使用 Laravel 的加密功能前,你需要先为 config/app.php 配置文件中的 key 参数设置一个值,这个值是一个包含 32 个随机字符的字符串。如果这个值没有正确设置,所有由 Laravel 加密的数据都是不安全的。



基本用法:

加密

通过 Crypt facade 可以加密一段数据。所有加密采用的都是 OpenSSL 和 AES-256-CBC cipher。并且,所有加密过的数据都会被赋予一个“信息验证码”(MAC),以防被加密后所得到的字符串被篡改。

由此说明encrypt生成的值和key有关,并且加密数据后会赋予一个mac用在解密时的安全验证,由于项目更换环境后需要重新生成key,所以之前生成的数据在新的环境无法解密,



3.总结

以上报错说MAC值无效并不是计算机mac地址,而是laravel的encrypt加密与其app_key有关,并且为每一个数据赋予了一个特殊的mac验证码。

更换环境后需要先重新生成key,然后数据库中使用encrypt加密数据需要重新加密。



由此说明一旦app_key修改的话,数据库中大量的encrypt加密数据将全部作废,这不利于数据库的迁移和备份,所以还是使用hash加密吧。

最后修改于:2020-02-03 12:00:21
设置笔记主题

主题色

主色

强调色