zoukankan      html  css  js  c++  java
  • 关于PHP中token的生成的解析

    背景

    很多时候我们需要用 token 来作为一些标识, 比如: 一个用户登录后的认证标识.

    实现方式

    md5 的方式:

    $v = 1; // 自己定义的 需要hash 的value 值
    $key = mt_rand(); // 这里用 随机串作为key
    $hash = md5($key . $v . mt_rand() . time());
    echo $hash;

    执行结果: b63426a38f86b726ce0d327d48e47376 看着不是很舒服, 作为强迫症的我 是受不了的.

    md5 + base64 的方式

    $v = 1;
    $key = mt_rand();
    $hash = md5($key . $v . mt_rand() . time());
    $token = base64_encode($hash);
    echo $token;

    执行结果: MWQyMjE2NmI3NDA1MmRjZTQwOTQzZDZjMWU1OTE5OGU= 看着稍微舒服些了, 但是还不够好, 反观微信的 openid , 一般是不会有后面的 = 号的

    优化

    $v = 1;
    $key = mt_rand();
    $hash = md5($key . $v . mt_rand() . time());
    $token = str_replace('=', '', base64_encode($hash));
    echo $token;

    执行结果: Yzg4MWU0OTQ0MTRiZTI0YWYwMDJjOTYyODBkNjFmMTM 这下没有 = 号了, 舒服了些, 但是又太长了, 微信的 openid 可没这么长

    换种 hash 试试

    sha1 + base64 的方式

    $v = 1;
    $key = mt_rand();
    $hash = hash_hmac("sha1", $v . mt_rand() . time(), $key, true);
    $token = str_replace('=', '', base64_encode($hash));
    echo $token;

    执行结果: 7pn0pWzO+/TOoISNtDaewa4CyuXw 是短些了, 可是里面有 +/ 号, 很多情况下用 get 传递时会被 urlcode, urlcode 过后就这样了 7pn0pWzO%2b%2fTOoISNtDaewa4CyuXw, 这显然不是我们想要的

    继续优化

    $v = 1;
    $key = mt_rand();
    $hash = hash_hmac("sha1", $v . mt_rand() . time(), $key, true);
    $token = str_replace('=', '', strtr(base64_encode($hash), '+/', '-_'));
    echo $token;

    执行结果: JM9AkY7SAIROrJ7fhjIU2ApbMsI 这下不会 urlcode了, 看着也舒服些了, 我目前是这样用的...

    但是这是不是最优方案呢?

    转 :  https://www.php.cn/php-weizijiaocheng-406858.html

  • 相关阅读:
    程序员如何判断是否到了该辞职的时候?
    牛客网
    C++继承详解:共有(public)继承,私有(private)继承,保护(protected)继承
    为什么构造函数不能声明为虚函数,析构函数可以
    为什么要线程同步,说出线程同步的几种方法
    内存字节对齐
    std::map的删除
    阻塞调用ShellExecute函数
    无法打开包括文件:“SDKDDKVer.h”: No such file or directory
    Legacy C++ MongoDB Driver
  • 原文地址:https://www.cnblogs.com/fps2tao/p/11355344.html
Copyright © 2011-2022 走看看