背景

很多时候我们需要用 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了, 看着也舒服些了, 我目前是这样用的...

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

目前没发现什么更好的方案, 只是说出了我认为的比较好的方案

Vue-cli3.0 + Element UI + ThinkPHP5.1 + RBAC权限 + 响应式的后台管理系统

原文地址:https://segmentfault.com/a/1190000015721702

最新文章

  1. 线段树 poj 1436
  2. js实现文本框中内容的放大显示
  3. iOS开发——高级篇——iPad开发、iPad开发中的modal
  4. [课程设计]Scrum 1.4 多鱼点餐系统开发进度
  5. IE7 -- 鼠标移入显示下拉框 不显示的问题 / 以及宽度问题
  6. [转]varchar(n),nvarchar(n) 长度、性能、及所占空间分析
  7. 很赞的MathJax
  8. URAL 2066 Simple Expression (水题,暴力)
  9. C++编译器的函数名修饰规则
  10. PHP输出
  11. MyEclipse6.5安装SVN插件的三种方法z
  12. nodejs:注册登录session出错以及连接Mongodb数据库时Error connecting to database解决方案
  13. Java得到的一周的最后一天的一段时间内
  14. 震荡信号Simulink仿真
  15. 作业2——需求分析&原型设计
  16. Springboot整合Mybatis-puls
  17. zabbix使用客户端和不使用客户端监控指定端口
  18. matlab常用命令
  19. echarts中dataZoom的使用
  20. n2n的编译和运行、配置

热门文章

  1. HDU-ACM“菜鸟先飞”冬训系列赛——第9场
  2. 【插件开发】—— 8 IPreferenceStore,插件的键/值存储!
  3. 【转】Spring,Spring MVC及Spring Boot区别
  4. EL表达式(详解)
  5. python服务之flask
  6. Linux的proc文件系统 分类: linux 2014-06-02 10:21 623人阅读 评论(0) 收藏
  7. HashMap和List遍历方法总结及如何遍历删除元素
  8. JavaScript异常处理和事件处理
  9. 平衡图片负载,提升web站点访问体验
  10. 【C++】异常简述(二):C++的异常处理机制