Laravel 登录报错 Crypt : The Mac is invalid

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 20
Cooper

查一下 Crypt 。

7年前 评论
Summer

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

composer dump-autoload
composer clear-cache

你是不是修改了 APP_KEY

7年前 评论

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

7年前 评论
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]  

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

7年前 评论
Summer

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

7年前 评论
Summer

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

7年前 评论
Summer

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

7年前 评论

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

7年前 评论
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 都不行还是报错
``
7年前 评论

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

7年前 评论
Luff

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

7年前 评论

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

7年前 评论
Luff

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

7年前 评论

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

file

也可以在 .env文件里修改

file

7年前 评论
Luff

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

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

file
加入这行 代码

7年前 评论
vance

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

5年前 评论

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