Search by

youvision / think-salting

indiboy-create

ThinkPHP 密码加盐组件,提供 make_salt 随机盐生成与可配置前后缀的 AdminPassword 算法

Package info

github.com/indiboy-create/think-salting

pkg:composer/youvision/think-salting

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-11-07 19:46 UTC

This package is auto-updated.

Last update: 2026-11-11 03:18:58 UTC


README

面向 ThinkPHP 的开源工程索引:组件、框架、服务与发布工具,按能力组织,持续整理。 仓库地址:https://github.com/indiboy-create/ThinkPHP-PanGu/ 在线站点:https://indiboy-create.github.io/ThinkPHP-PanGu/

youvision/think-salting

ThinkPHP 8 密码加盐组件,提供随机盐生成与可配置前后缀的 MD5 加盐算法。

安装

composer require youvision/think-salting

ThinkPHP 8 会自动注册服务并合并 config/salting.php 默认配置。

配置

如需覆盖默认配置,在项目 config/salting.php 中按需定义,项目配置优先于组件默认值:

<?php

return [
    'prefix'      => 'Y!o^U',
    'suffix'      => 'V,is*Io(N',
    'charset'     => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_=+[]{};:,.<>?/~|',
    'length'      => 8,
    'length2'     => 10,
    'salt_field'  => 'salt',
    'salt2_field' => 'salt2',
];
配置项 说明
prefix MD5 算法前缀,对应原算法中的 Y!o^U,上线后不建议修改
suffix MD5 算法后缀,对应原算法中的 V,is*Io(N,上线后不建议修改
charset make_salt 随机取值的字符池,含大小写字母、数字和符号,支持 UTF-8
length 未指定位数时 make_salt 的默认长度,也是 makePair 中 salt 的默认长度
length2 makePair 中 salt2 的默认长度
salt_field 业务表中 salt 字段名约定
salt2_field 业务表中 salt2 字段名约定

生成随机盐

// 使用配置中的默认长度
$salt = make_salt();

// 自定义位数
$salt = make_salt(12);

// 面向对象写法
$salt = \Youvision\ThinkSalting\Salting::makeSalt(12);

// 一次生成入库所需的两段盐
$pair = \Youvision\ThinkSalting\Salting::makePair(8, 10);
// ['salt' => '...', 'salt2' => '...']

密码哈希

$password = 'user-password';
$hash     = admin_password($password, $salt, $salt2);

// 兼容原始函数名
$hash = AdminPassword($password, $salt, $salt2);

// 校验
$ok = admin_password_verify($password, $salt, $salt2, $hash);

算法与原始 AdminPassword 一致:

md5($salt2 . 'Y!o^U' . md5(md5($password) . $salt) . 'V,is*Io(N' . $salt);

其中 Y!o^U、V,is*Io(N 均来自配置项 prefix、suffix。

从数据库读取

组件不直接查库,salt、salt2 由业务层从用户记录中取出后传入:

use app\model\User;

class Login
{
    public function check(string $username, string $password): bool
    {
        $user = User::where('username', $username)->find();
        if (!$user) {
            return false;
        }

        return admin_password_verify(
            $password,
            $user->salt,
            $user->salt2,
            $user->password
        );
    }
}

注册时生成并保存:

$pair = \Youvision\ThinkSalting\Salting::makePair();

$user = User::create([
    'username' => $username,
    'password' => admin_password($password, $pair['salt'], $pair['salt2']),
    'salt'     => $pair['salt'],
    'salt2'    => $pair['salt2'],
]);