活动分享码直接使用 snowflake 生成的 ID 是否存在什么安全隐患?

2019-09-12 13:24:09 +08:00
 kid1412621

分享码和用户绑定,唯一且固定,无其它额外需求。

5699 次点击
所在节点    Java
28 条回复
IamNotShady
2019-09-12 16:52:09 +08:00
momocraft
2019-09-12 17:04:23 +08:00
要绝对唯一往往就需要生成算法是决定性 (提前生成好也是一种决定性)。再要短就容易被枚举。

几十个 bit 足够在在现实的概率上唯一了,比如 https://alex7kom.github.io/nano-nanoid-cc/
sun522198558
2019-09-12 17:07:51 +08:00
短网址那种做法
不想自己做短网址服务,可以自己每个用户的 url 去短网址服务申请一个短网址取短网址的最后几位存入自己的数据库
偷懒做法
zhenjiachen
2019-09-12 22:55:09 +08:00
我是直接把用户 ID 和活动 ID 拼接,然后中间家几个分隔符,再 md5
然后把 md5 的值和用户 id 还有活动 ID 存数据库。
troywinter
2019-09-13 00:19:37 +08:00
没必要过度设计,snowflake 已经是相当广泛应用过的 id 生成算法,碰撞不用考虑,对外暴露 id 加 salt 加密就可以了,只要不把原始 id 暴露出来就可以,等有人攻击你们系统了,也就有钱搞这些了
kid1412621
2019-09-18 17:38:33 +08:00
@troywinter 感谢分享,我觉得我的问题应该变成暴露用户 id 是否有隐患。

根据这里( https://stackoverflow.com/questions/3629134/should-i-expose-a-user-id-to-public ),一般应用直接暴露 id 应该没事,我看好多网站也是暴露了的。当然具体情况具体分析,我这里的需求可能不能直接暴露,因为 id 和兑换码联系了起来,要防止被枚举。
我的想法是这样,还是简单些做,用户注册的时候用 snowflake 生成的 id 做一遍 hash 或 encode,这样至少不是直接暴露 id,然后存到 db 做个 index, 兑换时(用户的分享码就是别人的兑换码,需求是这样 = =)再用这个码去找是否存在。
不知这样妥否,有无可以优化的地方。
kid1412621
2019-09-18 17:39:44 +08:00
@IamNotShady 有点疑问,我在线( http://encode-base62.nichabi.com )转了下,发现和这个库的结果不一样呢
kid1412621
2019-09-18 17:40:26 +08:00
@zhenjiachen 同意,简单直接,不过我这需求有些不一样

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

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

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

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

© 2021 V2EX