有趣的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

保姆级教程:手把手调试PX4Ctrl的油门映射与姿态控制(附ROS节点配置)

本文提供PX4Ctrl的深度调参指南,涵盖油门映射、姿态控制及ROS节点配置等关键环节。通过详细解析PX4控制器的核心逻辑、递归最小二乘法(RLS)参数估计及状态机设计,帮助开发者优化无人机飞控性能。附实战案例与安全调试建议,适合PX4开发者进阶学习。

weixin_30363981的博客 382

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

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

bocai_xiaodaidai的博客 4544

ClaudeCode入门01-环境安装(小白入门:手把手教你配置,超简单的一种接入方式)

文手把手教你从零搭建 Claude Code 开发环境。针对国内网络现状,我们采用 OpenRouter + Claude Code Router 的方案,支持支付宝/微信充值,无需科学上网即可完成配置。内容涵盖 Node.js 安装(macOS/Windows/Linux)、OpenRouter 注册与充值、Claude Code 和 Router 安装配置,以及一键启动脚本的编写。跟着截图一步步操作,10分钟搞定全部环境!

yueyeguzhuo的专栏 282

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

XiaoqiangClub的博客 7208

Hashids-Python 使用指南

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

gitblog_00444的博客 897

Flatten 层的深度理解与运用

Flatten 层的深度理解与运用

你要拥有一个你喜欢并且热爱的人生 7038

hashids,一个实用的 Python 库!

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

涛哥聊Python 1341

Unlocking Decoding-time Controllability: Gradient-FreeMulti-Objective Alignment with Contrastive Pr

将基于庞大网络语料库训练的大型语言模型(LLMs)(OpenAI,2023;Touvron 等,2023;Google,2023)与人类偏好对齐,是减少产生不安全(Wei 等,2023)、幻觉(Zhang 等,2023b)和有偏见(Gallegos 等,2023)内容的重要一步。随着偏好学习技术(如 PPO(Schulman 等,2017)、DPO(Rafailov 等,2023)及其他变体(Azar 等,2023;Ethayarajh 等,2024;

qq_52053775的博客 1169

Scratch全攻略:从入门到实践的编程之旅

Scratch 是一款由麻省理工学院(MIT)开发的图形化编程工具 ,它诞生的初衷是为了让编程教育更加普及,尤其是让孩子们能够轻松接触和学习编程。与传统的基于文本代码的编程方式不同,Scratch 通过将编程指令以图形化的积木形式呈现,极大地降低了编程的门槛,让编程变得如同搭积木一样简单有趣。

邓邓子的博客 1万+

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

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

gitblog_00757的博客 905

2025电赛嵌入式:K210教程-如何刷固件 如何烧录代码 全网唯一

本文介绍了K210开发板的固件刷写和开发环境搭建方法。主要内容包括:1)从Sipeed官网下载合适的MaixPy固件,根据需求选择完整版或精简版;2)使用k-flash等工具烧录固件,注意区分亚博和Sipeed开发板的固件版本;3)介绍了擦除闪存的两种模式(部分擦除和完全擦除)及其应用场景;4)搭建CanMV开发环境,通过MaixPy IDE连接开发板并进行程序调试。文章还提供了常见问题的解决方法,如串口驱动安装、固件兼容性检查等,为K210开发提供了完整的入门指南。

FJN110的博客 547

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

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

qq_32506555的博客 427

【WRF-DART第一期】WRF/DART概述

【WRF-DART第一期】WRF/DART概述

WW、forever的博客 107

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

Python爬虫和机器学习专栏 383

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

weixin_42539414的博客 152

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【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缓存的亲密接触之「伪共享」
codehole_
博客等级 码龄7年 34粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值