如何推导网站邮箱验证token的前缀加密逻辑(涉及MD5算法)
邮箱验证码生成逻辑推导
我正在尝试推导网站发送给新用户的邮箱验证码生成逻辑,在研究相关脚本库时找到了如下代码行:
<a href="{{ route('auth.email.verify', [ 'token' => data_get($user, 'verify_token.token').md5($user->email) ]) }}">
我原本认为校验token的生成规则是verify_token表存储的token值拼接用户邮箱的MD5值,但按该逻辑推导未得到正确结果。目前已知信息如下:
- verify_token数据库表中存储的对应token值为:
9bd4e22f70b2cbe99245c71a3502b504a8713951
- 实际发送到用户邮箱的完整验证链接为:
example.com/verify?token=1c428d4dc20602f439142feab8f572022c5d960feeceabaae007439eb87933f0846ee30e
我已经推导出该token末尾的eeceabaae007439eb87933f0846ee30e对应的是邮箱batista@gmail.com的MD5值,但无法确定token中该字段之前部分的加密逻辑,请问该如何推导这部分算法?
推导方案
- 先拆分实际收到的token:移除末尾32位的邮箱MD5段,得到待匹配的前半段值为
1c428d4dc20602f439142feab8f572022c5d960f,长度为40位,和数据库存储的原始verify_token长度完全一致,说明原始存储的token经过了一次哈希处理后才参与拼接。 - 优先验证常见哈希算法:直接对数据库存储的原始token
9bd4e22f70b2cbe99245c71a3502b504a8713951做SHA-1运算,SHA-1输出刚好是40位十六进制值,对比运算结果和拆分得到的前半段是否一致即可。 - 排查加盐逻辑:如果直接哈希不匹配,按优先级排查常见拼接规则:
- 原始token拼接站点配置的全局密钥(你找到的是Laravel框架代码,对应
.env文件里的APP_KEY值) - 原始token拼接用户的id、注册时间等唯一固定字段
- 原始token先做大小写转换、顺序翻转等预处理后再哈希
- 原始token拼接站点配置的全局密钥(你找到的是Laravel框架代码,对应
- 核查框架默认配置:Laravel自带的邮箱验证功能默认会对存储的token做哈希处理,前端下发的是哈希后的值,你可以直接核查站点
config/auth.php文件中email_verify相关的哈希开关配置。
内容的提问来源于stack exchange,提问作者Dorbagna
相关产品推荐
相关产品推荐

