首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Laravel要在plainTextToken上附加令牌密钥?

为什么Laravel要在plainTextToken上附加令牌密钥?
EN

Stack Overflow用户
提问于 2022-05-02 21:41:04
回答 1查看 543关注 0票数 2

引用Sanctum的下列代码:

代码语言:javascript
运行
复制
public function createToken(string $name, array $abilities = ['*'])
    {
        $token = $this->tokens()->create([
            'name' => $name,
            'token' => hash('sha256', $plainTextToken = Str::random(40)),
            'abilities' => $abilities,
        ]);

        return new NewAccessToken($token, $token->getKey().'|'.$plainTextToken);
    }

来源:https://github.com/laravel/sanctum/blob/31fbe6f85aee080c4dc2f9b03dc6dd5d0ee72473/src/HasApiTokens.php#L44-L53

为什么桑德姆把$token->getKey()附加到$plainTextToken上?换句话说,$token->getKey()部件的用途是什么?在身份验证期间,它是否用作密钥来检索加密的令牌字符串并使用Hash::check或其他方法进行比较?

我还有一个问题:创建personal_access_tokens表的迁移表明令牌列是唯一的。但是,在上面的代码中,我可以看到存储在令牌列中的值只是随机字符串hash('sha256', $plainTextToken = Str::random(40))的散列值。哈希函数是否总是返回唯一的值,这样它就不会违反唯一约束?

我的第一个想法是,应该将$token->getKey()附加到加密的字符串中,以使其具有唯一性。但我认为情况并非如此。

EN

回答 1

Stack Overflow用户

发布于 2022-09-29 08:14:52

圣殿createToken 创建了一个40个字符的字符串,

代码语言:javascript
运行
复制
Str::random(40)

然后对其进行散列处理,但在散列之前,将其存储到变量$plainTextToken.中。

代码语言:javascript
运行
复制
hash('sha256', $plainTextToken = Str::random(40))

散列令牌转到数据库,未散列令牌返回给用户。

代码语言:javascript
运行
复制
 $token = $this->tokens()->create([
        'name' => $name,
        'token' => hash('sha256', $plainTextToken = Str::random(40)),
        'abilities' => $abilities,
    ]);

用数据库记录的主键将未散列部分返回给用户.主键有助于快速找到令牌。如果您删除主键,它也将工作。

代码语言:javascript
运行
复制
 return new NewAccessToken($token, $token->getKey().'|'.$plainTextToken)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72092685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档