Laravel 登录报错 Crypt : The Mac is invalid

用 lavarel 框架写的项目,今天登陆突然提示 “The MAC is invalid.” 有没有人遇到过这种情况?求具体教程

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 20
Cooper

查一下 Crypt 。

5年前 评论
Summer

执行以下命令,然后再清除浏览器 Cookie 试试:

composer dump-autoload
composer clear-cache

你是不是修改了 APP_KEY

5年前 评论

@Summer 执行之后不行呢,我没修改 APP_KEY 啊

5年前 评论
Summer

出问题的地方应该是这里:https://github.com/illuminate/encryption/b...


    /**
     * Get the JSON array from the given payload.
     *
     * @param  string  $payload
     * @return array
     *
     * @throws \Illuminate\Contracts\Encryption\DecryptException
     */
    protected function getJsonPayload($payload)
    {
        $payload = json_decode(base64_decode($payload), true);
        // If the payload is not valid JSON or does not have the proper keys set we will
        // assume it is invalid and bail out of the routine since we will not be able
        // to decrypt the given value. We'll also check the MAC for this encryption.
        if (! $this->validPayload($payload)) {
            throw new DecryptException('The payload is invalid.');
        }
        if (! $this->validMac($payload)) {
            throw new DecryptException('The MAC is invalid.');
        }
        return $payload;
    }
    /**
     * Verify that the encryption payload is valid.
     *
     * @param  mixed  $payload
     * @return bool
     */
    protected function validPayload($payload)
    {
        return is_array($payload) && isset($payload['iv'], $payload['value'], $payload['mac']);
    }
    /**
     * Determine if the MAC for the given payload is valid.
     *
     * @param  array  $payload
     * @return bool
     */
    protected function validMac(array $payload)
    {
        $bytes = random_bytes(16);
        $calcMac = hash_hmac('sha256', $this->hash($payload['iv'], $payload['value']), $bytes, true);
        return hash_equals(hash_hmac('sha256', $payload['mac'], $bytes, true), $calcMac);
    }

解析的内容,类似于这样的:

[7]  $baseDecoded = base64_decode('eyJpdiI6IkdUNHBhMDdrRStzQ0RtRkN5blNheWc9PSIsInZhbHVlIjoiZjBDVlpGS28rMFwvbmdiY0FaaUVWb1E9PSIsIm1hYyI6Ijk1NWQzN2QzZmQwNmU3YzY2NDc2N2Y2NmI4NTQ4MmVlZTNjYmE2NzdjYmQ1NjVmOGM4ZjUzN2FkNzFlMDNhZTUifQ==');

// '{"iv":"GT4pa07kE+sCDmFCynSayg==","value":"f0CVZFKo+0\\/ngbcAZiEVoQ==","mac":"955d37d3fd06e7c664767f66b85482eee3cba677cbd565f8c8f537ad71e03ae5"}'

[8]  $jsonDecode = json_decode($baseDecoded,true);
// array(
//   'iv' => 'GT4pa07kE+sCDmFCynSayg==',
//   'value' => 'f0CVZFKo+0/ngbcAZiEVoQ==',
//   'mac' => '955d37d3fd06e7c664767f66b85482eee3cba677cbd565f8c8f537ad71e03ae5'
// )
[11]  

你现在是在开发环境下,还是在生产环境呢?

5年前 评论
Summer

@走失的光年 你用的是 Homestead 吗?

5年前 评论
Summer

@走失的光年 win 下的吗?如果是的话,请使用 homestead

5年前 评论
Summer

@走失的光年 这个问题很有可能是 win 下面 env() 获取问题导致的,开发使用 Homestead 的话,可以避免很多头痛的问题。

5年前 评论

@Summer 好的,我换个开发环境试试

5年前 评论
Luff

@Summer 手贱执行了一下 php artisan key:generate 然后就出现 DecryptException in BaseEncrypter.php line 48: The MAC is invalid.
根据各种方法


composer dump-autoload
composer clear-cache
composer update
清除浏览器 cookie 都不行还是报错
``
5年前 评论

@QiyueShiyi 执行命令后会重新生成key 将生成的key复制到config/app.php替换82行的APP_KEY键值 保存

5年前 评论
Luff

@走失的光年 没用啊,key => 'base64:xLJwwQdEOj7q5YwD4s+WM9dNSBDGI6SRJkhOODGFGcI='
再说 php artisan key:generate 生成后回自动替换掉原来的啊,没必要复制过去嘛

5年前 评论

@QiyueShiyi key一般为32位你这好像不对吧

5年前 评论
Luff

@走失的光年 这就是 Laravel 自己生成的,我的是 5.2.*

5年前 评论

@QiyueShiyi 重新生成 复制过去看看
app.php 是这么写的话

file

也可以在 .env文件里修改

file

5年前 评论
Luff

@走失的光年 关键是执行不了 php artisan 命令了,执行了就报错

[Illuminate\Contracts\Encryption\DecryptException]  
  The MAC is invalid.
5年前 评论

file
加入这行 代码

5年前 评论
刘隆检

这个问题是你用了Crypt加密和解密,使用了我们在.env生成的APP_KEY,如果是在别处挪过来的数据,然后在解密用了本地的APP_KEY,所以报错,在那里挪过来的数据,就用那里的APP_KEY吧!
都是这个道理吧

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!