V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jss
V2EX  ›  PHP

请教一下:如何生成可以防穷举的数字编号

  •  
  •   jss · 2019-03-02 11:05:23 +08:00 via iPhone · 5755 次点击
    这是一个创建于 1854 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需要为每个用户生成唯一 6~12 为不等的数字编号,切防穷举。
    27 条回复    2019-03-09 22:30:31 +08:00
    hu5ky
        1
    hu5ky  
       2019-03-02 11:08:39 +08:00 via Android
    加密
    lhx2008
        2
    lhx2008  
       2019-03-02 11:08:48 +08:00 via Android
    前面递增,后面加一个 4-8 位随机值就 ok
    rochek
        3
    rochek  
       2019-03-02 11:09:02 +08:00
    防穷举?
    那么为何一定要用数字
    英文字符,标点都加上去
    phy25
        4
    phy25  
       2019-03-02 11:11:41 +08:00 via Android
    phy25
        5
    phy25  
       2019-03-02 11:13:15 +08:00 via Android
    好吧,没有仔细看要求……不过上面的库的介绍提到了 If you need your ids to consist of only numbers, check out Optimus. It's based on Knuth's integer hash method and produces obfuscated integer ids (and does it faster too). There are PHP and Go implementations.
    loading
        6
    loading  
       2019-03-02 11:23:23 +08:00
    不如用大质数?哈哈
    参考 fail2ban 策略。
    gleox
        7
    gleox  
       2019-03-02 11:25:40 +08:00   ❤️ 1
    smallthing
        8
    smallthing  
       2019-03-02 11:26:14 +08:00 via iPhone
    不懂,还不是能穷举吗
    xiaopc
        9
    xiaopc  
       2019-03-02 11:43:16 +08:00 via Android
    是防遍历还是防被找出 ID 规律?
    shiyidi
        10
    shiyidi  
       2019-03-02 11:56:51 +08:00
    在固定位置加校验位
    qiayue
        11
    qiayue  
       2019-03-02 11:58:46 +08:00
    12 位最大值千亿
    依然可以穷举
    asdqaz
        12
    asdqaz  
       2019-03-02 12:10:24 +08:00 via Android
    你这不就是激活码吗
    看看微软老人家的 25 位激活码
    asdqaz
        13
    asdqaz  
       2019-03-02 12:10:36 +08:00 via Android
    @asdqaz 原理类似激活码
    asdqaz
        14
    asdqaz  
       2019-03-02 12:28:57 +08:00 via Android
    哈希函数求值
    取前 12 位
    防破解加前缀后缀
    xxgirl2
        15
    xxgirl2  
       2019-03-02 12:48:59 +08:00
    snowflake+1
    MachineSpirit
        16
    MachineSpirit  
       2019-03-02 12:56:50 +08:00 via Android
    倒不如限制访问了,他们穷举肯定要一个一个试的。
    misaka19000
        17
    misaka19000  
       2019-03-02 13:01:20 +08:00
    纯数字的话,你这个可选数字太少了,穷举起来很简单
    lihongjie0209
        18
    lihongjie0209  
       2019-03-02 13:01:41 +08:00
    只要是数字,就可以穷举
    binsys
        19
    binsys  
       2019-03-02 13:04:08 +08:00
    hashid
    niknik
        20
    niknik  
       2019-03-02 14:09:12 +08:00
    uuid
    janus77
        21
    janus77  
       2019-03-02 17:09:11 +08:00
    理论上纯数字是不可能防止穷举吧
    我能想到的最好办法就是使用不定长的数字,比如有一个是 1,有一个是 451651,有一个是 6168406015
    另外重点应该是在被破解的中间途径上加强防护
    siyemiaokube
        22
    siyemiaokube  
       2019-03-02 18:31:34 +08:00 via iPhone
    @janus77 你仔细想想,这只是把 10 个字符变成了不到 11 个字符而已,没什么区别
    DreaMQ
        23
    DreaMQ  
       2019-03-02 19:22:14 +08:00 via iPhone
    随机不行吗?除非你的用户很多
    superzmy
        24
    superzmy  
       2019-03-03 03:25:02 +08:00
    你需要一个映射函数,把实数空间 A 映射到 实数空间 B,具体做法可以用一个数用各种不同进制的混合表示,然后交换他们的位置。
    简单来说 12345 这个十进制,交换百位和十位,可以映射为 12435。
    在上述这种方案上叠加不同进制,再加入各种循环偏移量,你就得到一个不好破译的映射算法。这个算法写在服务端生成 id 号的地方,服务端内部有个普通自然数自增量,通过这个映射函数生成用户 id,这个 id 就会非常没有规律性。
    msg7086
        25
    msg7086  
       2019-03-03 11:53:57 +08:00
    穷举本来就是最后一种方法,哪有防穷举这种东西。
    比如我问你,我一年工资多少钱,精确到分。于是你从 0.01 开始穷举,一路往上到几百,几千,几万,总有一天能穷举出正确答案的。
    你说的可能是防规律遍历。
    atcdef
        26
    atcdef  
       2019-03-03 15:51:21 +08:00
    楼上说得有道理,穷举这事根本不能防,这本来就是最简单最有效的办法,只是时间问题而已。所以你要防的是怎么才能禁止别人多次尝试,比如强制每 ip 每 5 秒钟只能试一次之类的
    linpf
        27
    linpf  
       2019-03-09 22:30:31 +08:00
    参考最近雪碧活动生成的随机地址, 长度如果不能拉长,那么就连:#_这种符号都算有效字符。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5345 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 79ms · UTC 05:49 · PVG 13:49 · LAX 22:49 · JFK 01:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.