【问题标题】:using linear congruential generator to obfuscate row ID?使用线性同余生成器来混淆行 ID?
【发布时间】:2015-12-09 03:56:45
【问题描述】:

假设我们有一个系统,它将电子商务订单作为一行存储在数据库中,并且使用顺序递增的 int 作为主键。

现在我们想向客户公开订单 ID,但通过使用数据库行 ID 作为订单 ID,客户将能够计算出订单量。

建议使用 Lehmer 随机数生成器 来混淆 ID。系统的上限设置为 2^31 -1,这是推荐的素数,并在许多库中使用。由于许多库使用的素数和乘数已经是provided it,因此最好使用其中之一,因为该数字已作为素数进行验证和测试。

但是使用这些数字不会提供任何混淆,因为它很容易为增量序列重新生成结果。

订单ID,客户ID通常由系统生成而不暴露数据库序列。

UUID不是一个选项,上限是2^31 -1

【问题讨论】:

    标签: random database-design uniqueidentifier


    【解决方案1】:

    嗯,你需要将顺序整数转换成不可破译的东西。简单的解决方案是在 RNG 模式下使用 AES 密码。类似于https://github.com/swenson/aesrng

    【讨论】:

      【解决方案2】:

      您可以堆叠任意数量的变换以使反转更加困难,但您永远不会让它变得不可能。

      在算法中保留一个大秘密的一种简单方法是为单词中的每个字节制作一个替换表。

      x = table0[x & 255]
        | (table1[(x >> 8) & 255] << 8)
        | (table2[(x >> 16) & 255] << 16)
        | (table3[(x >> 24) & 127] << 24);
      

      每个表都是 0..255 的随机播放(最后一个表除外,因为你只需要 31 位,所以最后一个表是 0..127)。

      然后将其与其他转换结合使用,例如 x = x ^ (x &gt;&gt; 11)x = x * 1103515245 % 2147483648

      只要每一步都产生一个唯一的数字,那么整个链也会产生一个唯一的数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 2019-11-29
        • 1970-01-01
        • 2013-07-11
        相关资源
        最近更新 更多