有趣的Python开源库之Hashids

从零手写Python可逆ID混淆器,解决URL自增ID暴露问题 在Web开发中,URL里出现连续的纯数字自增ID(如/user/1001)极易被遍历抓取,造成数据泄露风险。解决这一问题的常见思路是引入混淆机制——它不同于加密需要密钥抗破解,也不同于哈希单向不可逆,而是通过自定义字母表进行可逆的进制转换,将数字ID映射为无规律的短字符串,同时支持还原。这种技术在高并发短链接、防爬虫、敏感接口防护等场景中具有实用价值。本文从概念与原理切入,结合一个Python练手项目,完整展示了如何从零实现一个基于打乱字母表的可逆ID混淆器,覆盖核心代码设计、URL安全字符处理、测试验证, 阅读详情

0?wx_fmt=png

Hashids是一个非常小巧的跨语言的开源库,它用来把数字编码成一个随机字符串。它不同于md5这种算法这种单向映射,Hashids除了编码还会解码。

拿论坛来说,一般帖子在数据库里的id都是顺序递增的,但是你可能不想在url上直接把id暴露出来,以免爬虫直接遍历id爬取你的内容,给你带来损失。那现在你就可以使用Hashids把这个id搞乱,让它失去顺序性,无法直接遍历,这样就可以直接提高了爬虫的门槛。著名的Youtube网站就是这么做的。

我们来看看它怎么使用 首先安装一下 pip install hashids

0?wx_fmt=jpeg

我们看到hashids不仅可以编码一个整数,还可以一次编码多个整数。解码的时候不需要对字符串进行分割,可以直接解码成多个整数。这在存储一个帖子的相关帖子时给我们多了一种选择,一般我们使用json打包多个帖子id放在帖子表的一个字段里,现在我们就可以使用hashids把它们编码成一个字符串塞进去了,可以节省一定的存储空间。不过,除此之外我想不到编码多个整数有什么其它的用途了。

hashids需要提供一个salt值,相当于编解码的私钥,别人不知道你的私钥,就无法编码出对应的帖子的展现key,也无法通过url上的展现key解码出对应的帖子id。所以想直接遍历你的帖子服务那就做不到了。

现在我们试试随便提供字符串,对它进行解码会怎样

0?wx_fmt=jpeg

我们看到这些字符串都是非法,所以hashids无法解码出对应的整数。

下面我们对一段连续整数进行编码

0?wx_fmt=jpeg

可以发现编码之后的值在直觉上是没有任何规律可言的。

鉴于hashids是如此的小巧,笔者随后对它的源代码进行了一番研究。首先看看它的构造器

0?wx_fmt=jpeg

我们发现可以设置编码后字符串的最小长度。如果你不设置这个最小长度,对于一个从0开始的自增id,编码出来的字符串长度一开始只有2位,但是随着id的增长,编码后的长度也越来越大,但是最终这个长度值越来越稳定,因为位数越大可以表达的数值就越多。如果我们设置了这个最小长度,在id没有恐怖的快速增长的情况下,那么编码出的长度一开始就是非常稳定的。

然后我们还可以设置映射字典。默认是base64[26+26+10]编码,如果你不喜欢大小写敏感,可以改成base36[26+10]编码,甚至可以改成火星文,如果你真这么无聊的话。

0?wx_fmt=jpeg

注意火星文的字典必须是unicode类型。不然你编码得到的不是火星文,而是乱码。具体实现算法我就跳过了,有点复杂,我就不讲了。

0?wx_fmt=jpeg

然后它还支持对16进制字符串进行编解码,看来mongodb的id也可以纳入进来了。

最后算法的实现原理,仔细研究了一下,有点复杂,很难三言两语讲清楚,有兴趣的话读者还是自己阅读官方文章吧。算法的作者不保证安全性,不建议将hashids用在安全领域。

维基百科提到一个理想的hash算法需要满足下面3个特性

  1. 正向计算hash很容易

  2. 反向破解hash极其困难

  3. hash值碰撞概率极小

hashids满足第1和第3条,正向计算hash很快,hash值完全没有碰撞,保证了唯一性。如果知道salt值,还可以逆向通过hash值计算出原值。那第2条是否满足取决于你的salt秘钥有多容易被攻击者拿到。如果你的salt秘钥来自于常用字典单词,那攻击者可以通过彩虹字典快速将秘钥破解。你把秘钥好好保护,设置的随机一点长度长一些,安全性还是可以得到保障的。

最后你可千万别把秘钥搞丢了,一旦搞丢了,就意味着所有帖子的展现id需要重新计算一边,变的跟以前不一样了,搜索引擎收录的所有网页就失效了,别人外链过来的地址全都打不开,这无疑会给你的网站带来很大的损失。

0?wx_fmt=jpeg

阅读更多相关文章,请关注公众号【码洞】

hashids.php-master整数生成唯一字符串的加密库.zip <?php namespace Hashids; class Hashids implements HashidsInterface {     const SEP_DIV = 3.5;     const GUARD_DIV = 12;     /**      * The alphabet string.      *      * @var string      */     protected $alphabet;     /**      * The seps string.      *      * @var string      */     protected $seps = 'cfhistuCFHISTU';     /**      * The guards string.      *      * @var string      */     protected $guards;本库是让整数生成唯一字符串的加密库,可以隐藏用户ID等多种用途。 立即下载

相关推荐

hashids-python, hashids的实现( http.zip

hashids-python, hashids的实现( http 用于 python-2.6 -3的 hashidsJavaScript hashids 实现的一个 python 端口。 它可以从一个或者多个数字生成类似于哈希的youtube 。 如果不希望将数据库id公开给用户,请使用 hashids

Python 使用Hashids 进行加密

Hashids是一个小巧的,开源的python库。可以使用他来进行对数字的编码加密成一个随机字符串。 安装:sudo pip installHashids 使用例子: #!/usr/bin/python # -*- coding: UTF-8 -*- import hashids def main(): hasher = hashids.Hashids(salt = "sasa...

dawn_02的博客 1006

第十九届全国大学生智能车竞赛越野信标 硬件篇

全国大学生智能汽车竞赛,越野信标组

2301_77568650的博客 4118

python中有趣的hashids库(加密数据库id等数字)

Hashids是一个非常小巧的跨语言的开源库,它用来把数字编码成一个随机字符串。它不同于md5这种算法这种单向映射,Hashids除了编码还会解码。 拿论坛来说,一般帖子在数据库里的id都是顺序递增的,但是你可能不想在url上直接把id暴露出来,以免爬虫直接遍历id爬取你的内容,给你带来损失。那现在你就可以使用Hashids把这个id搞乱,让它失去顺序性,无法直接遍历,这样就可以直接提高了爬虫的...

bocai_xiaodaidai的博客 4544

【实战】ComfyUI-Impact-Subpack插件安装与UltralyticsDetectorProvider节点修复全流程

本文详细解析了ComfyUI中UltralyticsDetectorProvider节点缺失的原因,并提供了完整的ComfyUI-Impact-Subpack插件安装与修复全流程。核心在于Impact Pack插件架构调整导致节点被拆分至子插件包。指南涵盖手动安装、依赖安全配置、模型文件管理及深度排错步骤,帮助用户彻底解决节点缺失问题,恢复工作流正常运行。

weixin_29290947的博客 438

Ubuntu下Ollama局域网共享大模型服务:5分钟搞定配置与防火墙设置

本文提供了一份在Ubuntu系统上快速配置Ollama实现局域网共享大模型服务的实战指南。通过修改服务配置使其监听所有网络接口,并设置UFW防火墙规则,用户可在5分钟内让同一Wi-Fi下的其他设备(如笔记本、手机)便捷调用主机上的AI模型能力,实现团队或多设备间的AI资源共享。

ik6789012的博客 825

Hashids-Python 使用指南

Hashids 是一个用于生成短小、模糊化 ID 的库,旨在将数字 IDs 转换成看起来像是随机字符串的形式,但保持可逆性。[hashids-python](https://github.com/davidaurelio/hashids-python) 是这个项目的 Python 实现版本,它允许开发者在不牺牲隐私或安全性的前提下,展示更友好的 ID 在前端,例如,作为 URL 参数。 ## 项...

gitblog_00444的博客 897

Allegro输出光绘文件规范

添加钻孔表的具体步骤为:1.通过屏幕右边的Visibility选项的Views列表,将Drill层打开2.将Visibility选项中的PIN和Via选项都选中,见下图所示: 参数设好之后关闭NC Drill/Parameters窗口,输出数控机床钻孔文件的命令菜单为:Manufacture=>NC=>NC Drill…,打开的窗口如下: 输出数控机床钻孔文件的具体步骤为: 上图是光绘输出的层控制窗口,还有一个窗口是输出参数的控制窗口,我们通过点击上图的第二个列表项General Parameters来

axingxiansen的博客 2809

hashids,一个实用的 Python 库!

可以在创建Hashids对象时,指定自定义的盐值、最小hashid长度和字符集。# 创建带有自定义参数的Hashids对象print("自定义参数的Hashids对象创建成功")# 编码整数IDprint("编码后的hashid:", hashid)hashids库是一个功能强大且易于使用的工具,能够帮助开发者将整数ID转换为难以预测的短字符串。通过支持自定义盐值、最小hashid长度、字符集和多整数编码,hashids库能够满足各种应用场景的需求。

涛哥聊Python 1341

LPDDR5 学习笔记07:读写操作详解

本文介绍了LPDDR5 SDRAM的读写操作时序规范。对于读操作,需在时钟上升沿发送读指令,经过RL延迟后输出首个有效数据,并需定期校准采样时钟以补偿时序偏移。写操作需先建立WCK2CK同步状态,WCK信号需提前驱动,并在写入数据后保持活动状态。连续读写操作中,若指令间隔超过特定阈值需重新同步。还介绍了RDQS模式,通过数据选通信号提高高速场景下的数据采集可靠性。所有操作都需满足严格的时序参数要求,包括前后导码、后缀周期等,以确保数据可靠传输。

一只豌豆象的博客 2726

GEE土地分类:一文读懂精度评定—混淆矩阵confusion matrix、整体精度OA、用户者精度、生产者精度、kappa系数和F1score系数含案例

本文介绍了如何在 Google Earth Engine (GEE) 中构建和分析混淆矩阵,以评估分类模型的性能。首先,通过 ee.Array 构建混淆矩阵,并展示了如何指定自定义类标签。接着,计算了多种性能指标,包括准确率、Kappa 值、F1-score、消费者准确率和生产者准确率。此外,还演示了如何计算不同类别的 F1-score。最后,通过一个实际案例,展示了如何利用 GEE 进行土地分类,并评估分类器的性能,包括训练和验证样本的准确率、Kappa 值等指标。这些步骤帮助用户理解模型的优缺点,并进行

此星光明博客 444

AgentScope:5 分钟跑通可视化的智能体框架

当你想让 AI 自己执行命令、读写文件,又怕它中途乱来,AgentScope 智能体框架把每一次思考、每一次工具调用都实时推到屏幕:过程看得见,动作叫得停。它适合想自建智能体应用、同时又要管得住执行过程的开发者和团队。 ## 项目速览:两层架构,一条事件流 AgentScope 2.0 是阿里通义实验室出品的开源多智能体框架,提供两层用法。底层是 Python SDK:ReAct 循环、工具包

gitblog_00757的博客 905

基于YOLOv10深度学习的花生种子霉变检测系统

YOLO(You Only Look Once)是当前最先进的目标检测算法之一,具有快速、精准的特性。YOLOv10是YOLO系列的最新版本,相较于之前的版本,YOLOv10在特征提取、模型精度和速度上都有了显著的提升。YOLOv10采用了更深的卷积神经网络、更多的跨层特征融合方法,使得其在不同尺寸物体的检测和复杂场景的处理上都表现出了优异的性能。YOLOv10特别适合应用在需要快速处理并检测大量图像的任务中,如花生种子霉变检测等,能够实现精准、高效的检测。

2201_76125393的博客 649

一款用于搞乱数据库ID的开源Python库—Hashids

本文和大家分享的是python的开源库Hashids,Hashids主要是用于搞乱数据库ID,具体用法下文将为大家详细介绍,一起来看看吧,希望对大家学习python库有所帮助。 Hashids是一个非常小巧的跨语言的开源库,它用来把数字编码成一个随机字符串。它不同于md5这种算法这种单向映射,Hashids除了编码还会解码。  拿论坛来说,一般帖子在数据库里的id都是顺序递增的,但是你可能不想在u...

qq_32506555的博客 427

下载猫 —— 会员体系安全分析与加固方案

下载猫的会员验证体系完全失效,破解不需要任何工具链、不需要写代码、不需要改文件。已验证的成功攻击路径:攻击者启动软件时加一个参数,然后用 3 行 JavaScript 即可将会员状态改为"有效期至 2099 年",全部功能闸门放行。等价于普通用户按F12打开控制台输入 3 行代码,全程不到 10 秒。项目结论破解难度⭐ 极低(会按 F12 即可,无需任何破解工具)是否修改文件否(重启软件自动恢复)是否需要服务器否是否影响其他用户单人即可完成,可复制分发修复所需工作量。

猫敷雪 59

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

害,反爬之ID混淆 hashids 不了解下吗?

点击上方“Python高校”,关注文末干货立马到手爬虫与反爬是一对相生相克的死对头,道高一丈魔高一尺。作为爬虫的一方,如果知道了某个站点的数据自增ID,那么就能轻而易举把整个站点都爬下来...

Python爬虫和机器学习专栏 383

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

告别裸奔的自增ID:Hashids原理与接口混淆实战

数据库自增主键在C端接口中直接暴露,会带来数据泄露、爬虫遍历和后续迁移难等隐患。如何在不改变内部主键设计的前提下,为对外ID加一层安全防护?Hashids作为一种轻量级ID混淆方案,通过自定义进制转换、盐值驱动的字符表洗牌和随机填充,将整数ID编码为短且不可猜测的字符串,同时支持持有盐值时解码还原。它性能极低开销、实现简单,适合订单号混淆、短链接、邀请码等场景,但并非加密算法,真正的安全仍需依赖权限校验。本文从原理、参数选型到Controller层接入与踩坑经验,完整讲解如何用Hashids保护自增ID,帮

weixin_42539414的博客 152

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Python、第三方库】对ID进行编码

hashids 加密ID import hashids # 可以用 alphabet 参数(str)指定结果字符集,默认是大小写字母加数字 hash_ = hashids.Hashids(salt='8vrC#BedKqh9a*Np', min_length=10) # 编码 hash_.encode(3) # 'KP3RLAW7MV' 可以传多个值进去,解码的时候得到的是当初的多个值组成的元...

Ike Liu 490

flask中如何自定义一个FlaskHashids类

1. Hashids是一个非常小巧的跨语言的开源库,它用来把数字编码成一个随机字符串。它不同于md5这种算法这种单向映射,Hashids除了编码还会解码。 拿论坛来说,一般帖子在数据库里的id都是顺序递增的,但是你可能不想在url上直接把id暴露出来,以免爬虫直接遍历id爬取你的内容,给你带来损失。那现在你就可以使用Hashids把这个id搞乱,让它失去顺序性,无法直接遍历,这样就可以直接提高了爬虫的门槛。 2. 安装 pipinstallhashids 3. 自定义实现 from h...

weixin_42289273的博客 342

python把字符串3des加密_Python干货之六大密码学编程库

信息加密和信息隐藏是实现信息安全与保密的主要手段。除了一些经典的加密解密算法和自己设计的加密算法之外,我们还可以充分利用Python标准库和扩展库提供的丰富功能来辅助我们完成信息加密解密实现。本文收集了6个常用的Python密码学编程库以供参考。1、HashidsHashids是一个非常小巧的跨语言的开源库,它用来把数字编码成一个随机字符串, 并轻松通过key解码回来。这对于将多个参数捆绑到一个参...

weixin_39747595的博客 273

介绍一款用于搞乱数据库ID的开源Python库

Hashids是一个非常小巧的跨语言的开源库,它用来把数字编码成一个随机字符串。它不同于md5这种算法这种单向映射,Hashids除了编码还会解码。 拿论坛来说,一般帖子在数据库里的id都是顺序递增的,但是你可能不想在url上直接把id暴露出来,以免爬虫直接遍历id爬取你的内容,给你带来损失。那现在你就可以使用Hashids把这个id搞乱,让它失去顺序性,无法直接遍历,这样就可以直接提高了爬虫的...

weixin_33795833的博客 80

python gui界面设置数据储存在哪里_我整理的一些常用Python库!让你快速记住这些库的用法!建议收藏...

Python的一大特色是其丰富的模块,基本上只要你能想到的常见的开发需求,都能找到别人已经实现的库直接使用,或者相关工具或则框架来辅助实现。但这对于新人来说也是一个问题:这么多库,我要从哪里学起?怎样才能记住这些库的用法?GUI 图形界面Tkinter : Tkinter默认的图形界面接口wxPython: Python首选的GUI库PyGTK: PyGTK是一套GTK +GUI库的Python封...

weixin_39618169的博客 361

码洞原创深度技术文章大全 —— 高端面试必备

《快学 Go 语言》第 11 课 —— 协程《快学 Go 语言》第 10 课 —— 错误与异常《快学 Go 语言》第 9 课 —— 接口《快学 Go 语言》第 8 课 —...

codehole_的博客 293

Hashids-python

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33744854的博客 310
上一篇: 依赖注入不是Java的专利,Golang也有
下一篇: Java与CPU缓存的亲密接触之「伪共享」
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值