根据 id 生成唯一可反转短字符串(防止用户 id 等暴露), 用 hashids 稳妥不?

2018-12-19 11:55:56 +08:00
 kkk212

https://hashids.org/ Hashids is a small open-source library that generates short, unique, non-sequential ids from numbers.

It converts numbers like 347 into strings like “ yr8 ”, or array of numbers like [27, 986] into “ 3kTMd ”.

You can also decode those ids back. This is useful in bundling several parameters into one or simply using them as short UIDs.

比如字符串长度设置 4-6 位,等用户量大了接近 4-6 位字符能表示的用户量时, 会不会出现重复的。

6055 次点击
所在节点    程序员
39 条回复
luosuosile
2018-12-19 11:58:41 +08:00
我也遇到这个问题了,,帮顶吧。。本来我都打算用 uuid 了,顺带一提网上搜到的 short uuid 不太靠谱,评论都说几万条就重复了。
kkk212
2018-12-19 12:07:37 +08:00
@luosuosile 我目前用的方案是,单独建一个表添加唯一索引,随机生成 6 位的字符串,然后插入千万条记录。这样是能保证重复问题,但是用的时候增加了一条 sql 查询。hashids 优点是能直接加密反转,不过还不太敢用。
binux
2018-12-19 12:13:36 +08:00
Do you have a question or comment that involves "security" and "hashids" in the same sentence? Don't use Hashids. Here are some ways to decode:

https://hashids.org/#decoding

前面有个帖子我就说了,找个加密算法(比如 AES )算一下就行了。
kkk212
2018-12-19 12:23:15 +08:00
@binux 怎么做到短字符串呢,比如 id 30 用 3jdhey 代替
jedrek
2018-12-19 12:31:48 +08:00
hashids 不是用来加密的, 这东西和 base64 是一样的东西, 区别是 hashids 可以加个盐再编码
binux
2018-12-19 12:33:39 +08:00
@kkk212 用 ctr 模式
binux
2018-12-19 12:42:06 +08:00
@binux 看了下 ctr 模式可以算出加密用的块 stream 啊,你用小一点的块?
kkk212
2018-12-19 12:55:23 +08:00
@binux 主要看到一些网站,用户主页的 id 有用用户昵称的,有用字符串的( 6 位左右)。用字符串的话,比如用 MD5 就行,但是 16 位或 32 位太长了不好看。开始没看 hashids 原理, 感觉 hashids 可以,有点缺点就是不定长和能看出来原数字的大小。谢谢,我一会再看看 aes
kkk212
2018-12-19 13:11:37 +08:00
嗯,看了 hashids 原理明白了。但是为什么说不是用来加密的,加了盐值就和 base64 只是编码转换不一样了
kkk212
2018-12-19 13:12:42 +08:00
@jedrek 嗯,看了 hashids 原理明白了。但是为什么说不是用来加密的,加了盐值就和 base64 只是编码转换不一样了
xenme
2018-12-19 13:22:41 +08:00
看你要求多安全,一般安全性自己撸一个 base64 的变种,基本没人看得出来,也是最简单的加密。不要说 base64 不是加密,只是大家都知道加解密方式而已。
leonard916
2018-12-19 13:25:02 +08:00
@xenme 確實不是加密 只是把 byte[]變成字符串而已
xenme
2018-12-19 13:33:26 +08:00
有哪种加密不是把 byte[]或者 string[]变成另外一串 byte[]或者 string[]么?
只是变换的方式(加密算法)不同罢了。

只是说现在 base64 类型的加密实在没有安全性,而且更多被人用来当做一种编码方式而已。
jedrek
2018-12-19 13:51:33 +08:00
@kkk212 加了盐值是跟默认编码后结果不一样, 有了个“定制化”的编码结果. 但是编码算法是一样的.
并不是说 hashids 完全不行, 还是取决你的用途, 如果想把一长串数字缩得很短, 直观上看不出来, hashids 是个很好的方案; 但若为了不让客户端知道解码后的值, 就不应该这么做, 因为很容易就能破解, 应该考虑对称加密的算法.
jedrek
2018-12-19 13:54:46 +08:00
@kkk212 加了盐值是跟默认编码后结果不一样, 有了个“定制化”的编码结果. 但是编码算法是一样的.
并不是说 hashids 完全不行, 还是取决你的用途, 如果想把一长串数字缩得很短, 直观上看不出来, hashids 是个很好的方案; 但若为了不让客户端知道解码前(此处修正)的值, 就不应该这么做, 因为很容易就能破解, 应该考虑对称加密的算法.
woodensail
2018-12-19 13:58:02 +08:00
@xenme 现代密码学中,安全性不来自于算法的保密而来自于密钥的保密。所以 base64 和各种不引入外部密钥的数据编码方案都不能称之为加密。
xenme
2018-12-19 14:14:45 +08:00
@woodensail 针对楼主的需求来说,算法和密钥都是不需要公开的,安全性要求不是特别高的情况下,类似 base64/hashid 这种“加密”足够满足需求了。
kkk212
2018-12-19 14:27:39 +08:00
@xenme 可 hashid 的算法是暴露的
woodensail
2018-12-19 14:29:31 +08:00
@xenme 同楼上,不要把希望寄托在别人不会拆包上,搞黑产的有这个耐心。
jedrek
2018-12-19 14:29:46 +08:00
@kkk212 这么说可能都脱离了你的用途了. 说说你的用途和为啥想这么用. 说不定有更好的方案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/518925

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX