Laravel 数据ID混淆加密扩展包Hashid php版

发布时间:2019-05-16 编辑:小张个人博客 查看次数:194

哈希数据 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、源码很小,速度快,不依赖于外部库。




出处:小张个人博客

网址:http://blog.023xs.cn/

您的支持是对博主最大的鼓励,感谢您的认真阅读。欢迎转载,但请保留该声明。

顶部

Copyright © 小张个人博客 All Rights Reserved 渝ICP备15006773号-1

联系方式:[email protected] | 本站文章仅供学习和参考

渝公网安备 50024102500267号