Laravel 数据ID混淆加密扩展包Hashid php版
发布时间:2019-05-16 编辑:小张个人博客 查看次数:5297
哈希数据 ID —— hashids
普通项目中,我们使用的数据 ID 通常为数据库的自增 ID,自增 ID 有一些问题:
1、数据的 ID 是暴露的,容易根据 ID 猜测数项目中的数据量;
2、有可能被别人恶意采集;
3、随着数据的增长,ID 会越来越大,无法统一长度。
当然解决方案有很多种,例如 UUID,使用自己生成的 ID 等。我们来了解一下一种方便的解决方案 Hashidsis 。
Hashidsis 是一个小型开源库,Hashids 的主要目的是混淆数字 ID,可以通过数字生成简短,唯一,无序字符串的开源库,它不仅能将数字转换为字符串,还能将转换后的结果转换回数字,当您不希望向用户公开数据库数字 ID 时可以尝试使用它。
Hashidsis 支持 JavaScript,Ruby,Python,Java,Scala,PHP,Perl,Perl 6,Swift,Clojure,Objective-C,C,C ++ 11,D,F#,Go,Erlang,Lua,Haskell,OCaml,Elixir, Rust,Smalltalk,ColdFusion,Kotlin,Nim,VBA,Haxe,Crystal,Elm,ActionScript,CoffeeScript,Bash,R,TSQL,PostgreSQL,PLpgSQL,Dart,Io和.NET。
官网: https://hashids.org/php/
github 网址:https://github.com/ivanakimov/hashids.php
Laravel Hashids:https://github.com/vinkla/hashids
Composer 安装 Hashidsis
composer require hashids/hashids
Hashids 示例
use Hashids\Hashids; $hashids = new Hashids(); $id = $hashids->encode(1, 2, 3); // o2fXhV $numbers = $hashids->decode($id); // [1, 2, 3]
Hashids 更多的选择
encode() 函数传参支持数字、字符串、数组等。
$hashids = new Hashids(); $hashids->encode(1, 2, 3); // o2fXhV $hashids->encode([1, 2, 3]); // o2fXhV $hashids->encode('1', '2', '3'); // o2fXhV
设置盐值
其中盐值可以是任意长度任意字符的字符串,加密和盐值有直接的关系,盐值是解密的钥匙。我们可以直接取项目的密钥作为其盐值,以让项目统一,且不同项目的加密结果不一样。
$hashids = new Hashids(env('APP_KEY')); $hashids->encode(1, 2, 3); // 9eFDHo $hashids = new Hashids('xiaozhang'); $hashids->encode(1, 2, 3); // JrU1cW
设置 ID 输出长度
$hashids = new Hashids(); // 默认 $hashids->encode(1); // jR $hashids = new Hashids('', 10); // 设置 ID 输出长度为10 $hashids->encode(1); // VolejRejNm
自定义字母:
$hashids = new Hashids('', 0, 'abcdefghijklmnopqrstuvwxyz'); // 小写 $hashids->encode(1, 2, 3); // mdfphx
编码十六进制而不是数字
如果你想编码 Mongo 的 ObjectIds,这很有用。 请注意,没有限制你可以传递多大的十六进制数(它不必是 Mongo 的 ObjectId )。
$hashids = new Hashids(); $id = $hashids->encodeHex('507f1f77bcf86cd799439011'); // y42LW46J9luq3Xq9XMly $hex = $hashids->decodeHex($id); // 507f1f77bcf86cd799439011
Laravel 5 示例代码
模型文件
class Article extends Model { protected $table = 'article'; //定义表 protected $primaryKey = 'aid'; // 指定ID //添加表中不存在的字段,自定义字段 protected $appends = ['hash_id']; public function getHashIdAttribute() { $hashids= new Hashids(env('APP_KEY')); return $hashids->encode($this->getRouteKey()); } }
控制器文件
public function Article(Request $request,$aid) { $hashids= new Hashids(env('APP_KEY')); if(!is_numeric($aid)){ $aid = current($hashids->decode($aid)); } $data = Article::where('aid',$aid)->first(); return view('Home.new',compact('data')); }
模板文件
// URL: http://127.0.0.1/list/penRe7 <a href="{{url('list/'.$data->hash_cid )}}" >{{$data->cname}}</a>
Hashids 特征
1、如果伪输入传递给 encode(),将返回一个空字符串:
$hashids = new Hashids(); $id = $hashids->encode('123a'); dd($id); // " "
2、解码时,输出始终是一个数字数组(即使您只编码一个数字):
$hashids = new Hashids(); $id = $hashids->encode(1); $hashids->decode($id); // [1]
3、不要将此库用作安全措施。使用它来编码敏感数据。 Hashids不是加密库。
4、 从数字(正数和零)创建简短且唯一的ID,不支负数。
5、允许自定义字母、盐和长度 。
6、源码很小,速度快,不依赖于外部库。
Copyright © 小张个人博客 All Rights Reserved 渝ICP备15006773号-1
联系方式:[email protected] | 本站文章仅供学习和参考