登录

PHP短ID + 密码盐 + Token生成

PHP笔记 热门
0 1827
    /**
     * ID加密
     *
     * @param mixed $id 要加密的ID
     * @param boolean $is_decrypt 默认false 为 true 时反向解密
     * @param mixed $str_len 返回结果的字符串长度
     * @param string $key 密钥
     */
    public function alphaID($id $is_decrypt = false $str_len = false $key = null)
    {
        $out = '';
        // 26个小写英文字母+26个大写英文字母+10个数字
        $index = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        // 字符串长度
        $base = strlen($index);
        // 密钥存在 加密字符串增加安全性
        if ($key !== null) {
            for ($n = 0; $n < strlen($index); $n++) {
                $i[] = substr($index $n 1);
            }
            $pass_hash = hash('sha256' $key);
            $pass_hash = (strlen($pass_hash) < strlen($index) ? hash('sha512' $key) : $pass_hash);
            for ($n = 0; $n < strlen($index); $n++) {
                $p[] = substr($pass_hash $n 1);
            }
            array_multisort($p SORT_DESC $i);
            $index = implode($i);
        }
 
        if ($is_decrypt) { // 解密
            $len = strlen($id) - 1;
            for ($t = $len; $t >= 0; $t--) {
                $bcp = bcpow($base $len - $t);
                $out = $out + strpos($index substr($id $t 1)) * $bcp;
            }
            if (is_numeric($str_len)) {
                $str_len--;
                if ($str_len > 0) {
                    $out -= pow($base $str_len);
                }
            }
        } else { // 加密
            if (is_numeric($str_len)) {
                $str_len--;
                if ($str_len > 0) {
                    $id += pow($base $str_len);
                }
            }
            for ($t = ($id != 0 ? floor(log($id $base)) : 0); $t >= 0; $t--) {
                $bcp = bcpow($base $t);
                $a = floor($id / $bcp) % $base;
                $out = $out . substr($index $a 1);
                $id = $id - ($a * $bcp);
            }
        }
        return $out;
    }
 
    /**
     * 获取随机字符串(密码盐)
     */
    public function code_salt()
    {
        // 取随机6位字符串
        $strs = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $name = substr(str_shuffle($strs), mt_rand(0 strlen($strs) - 11), 6);
        echo $name;
    }

    /**
     * Token生成(全球唯一标识)
     *
     * sprintf() : 把格式化的字符串写入一个变量中
     * 语法为 : sprintf(format arg1 arg2 arg++);
     * 参数:
     * format: 必须,转换格式
     * arg1 : 必须,规定插入 format 字符串中第一个%符号处的参数
     * arg1 : 可选,规定插入 format 字符串中第二个%符号处的参数
     * arg1++ : 可选,规定插入 format 字符串中第三、四等%符号处的参数
     * 参数 format 的转换格式 以百分比符号(%)开始到转换字符结束 下面是有可能的format值.
     * %% – 返回百分比符号
     * %b – 二进制数
     * %c – 依照 ASCII 值的字符
     * %d – 带符号十进制数
     * %e – 可续计数法(比如 1.5e+3)
     * %u – 无符号十进制数
     * %f – 浮点数(local settings aware)
     * %F – 浮点数(not local settings aware)
     * %o – 八进制数
     * %s – 字符串
     * %x – 十六进制数(小写字母)
     * %X – 十六进制数(大写字母)
     */
    public static function code_token()
    {
        return sprintf(
            '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
            mt_rand(0, 0xffff),
            mt_rand(0, 0xffff),
            mt_rand(0, 0xffff),
            mt_rand(0, 0x0fff) | 0x4000,
            mt_rand(0, 0x3fff) | 0x8000,
            mt_rand(0, 0xffff),
            mt_rand(0, 0xffff),
            mt_rand(0, 0xffff)
        );
    }

发表评论

0 个回复