Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

让Segment模式生成的ID不连续,保证信息安全性 #118

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

NotFound9
Copy link

Leaf的官方介绍文章中曾经提到分布式ID应该保证信息安全性,

4.信息安全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可;如果是订单号就更危险了,竞对可以直接知道我们一天的单量。所以在一些应用场景下,会需要ID无规则、不规则。

image
image

让ID不连续,否则容易被恶意爬取和泄露单量,目前使用snowflake模式生成ID时是有取随机数相关的逻辑来保证ID不连续的,但是如果是Leaf-segment数据库方案来生成ID,每次从数据库取完ID,都是存储在内存中,发放给业务项目,所以运行期间,使用的ID都是连续的,竞争对手很容易通过在两天中午12点分别下单,通过订单id号相减就能大致计算出公司一天的订单量。如果我们在每次从数据库取一个分段的ID时,计算一个随机数,丢弃掉随机数数量的ID,这样就可以保证ID不连续,保证Leaf-segment数据库方案来保证生成ID的安全性。

源代码:SegmentIDGenImpl中updateSegmentFromDb()方法中计算当前ID分段最小值

long value = leafAlloc.getMaxId() - buffer.getStep();

修改后的代码

 int bound = buffer.getStep()/20;//随机值最大取值为5%的Step,主要考虑到buffer中id使用量超过10%就会触发另一个buffer的更新,所以我们取的随机值的最大值小于10%会好一些,不然一开始就触发更新了。
int randomValue = RANDOM.nextInt(bound);//生成随机值
long value = leafAlloc.getMaxId() - buffer.getStep() + randomValue;//丢弃随机值数量的id,让id不连续,保证id安全性

@leechliao
Copy link

原来是两变量,增加一个变量就增加了value重合的概率,如此就保证不了id的唯一性了

@ChinaLym
Copy link

ChinaLym commented Mar 2, 2024

个人观点,这个项目更像是是内部id生产器,和用户可见的流水号应该不是一回事,我理解这个服务生成的结果对于后台管理系统可以直接用,但对于堆外暴露的流水号,这个开源项目只能生成其中一部分,各种规则的数据分片规则等其他号段因素、再预测就非常不准了。
此时加入丢弃逻辑不是非常有必要

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants