背景

很多时候我们需要用 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

最新文章

  1. sharepoint2013爬xls文件:Error initializing IFilter for extension的解决方案
  2. 封装自己的Common.js工具库
  3. Swift 1.0: missing argument label 'xxx' in call
  4. ACM: FZU 2150 Fire Game - DFS+BFS+枝剪 或者 纯BFS+枝剪
  5. 自己动手搭建 CAS(Central Authentication Service) 环境,为了单点登录(Single Sign On , 简称 SSO )
  6. ABAP Util代码
  7. 分享我常用的一些JS验证和函数
  8. **IOS:xib文件解析(xib和storyboard的比较,一个轻量级一个重量级)
  9. 设计模式奠基石——UML关系转化为代码
  10. Hibernate createQuery调用joincolumn
  11. Markdown编辑后
  12. Greedy分饼干
  13. CF867E: Buy Low Sell High(贪心, STL) (hdu6438)
  14. Python性能分析
  15. 1--Python 入门--Python基础数据类型
  16. linux下安装redis安装使用
  17. ashx 一般处理程序中使用 Session
  18. activiti实战--第一章--认识Activiti
  19. activiti并行和串行区别
  20. Delphi XE5 for Android (三)

热门文章

  1. 1、uiautomator2常用语法
  2. Django分表操作、聚合及FQ方法
  3. WebLogic反序列化漏洞(CVE-2019-2725补丁绕过)
  4. java AST JCTree简要分析
  5. gdb调试(二)
  6. Druid Spring Boot Starter 从配置到简单运行 -解决zone不匹配 -解决dataSource加载失败
  7. el-select remote 远程搜索 多个共享一个options,options改变时输入框值不显示名称的问题
  8. notepad++ 调整行间距
  9. webpack起服务器报JavaScript heap out of memory
  10. Mysql 的使用方法