关于MySql ID列的建议 - Rails

时间:2015-10-31 01:47:46

标签: mysql ruby-on-rails postgresql

在Rails应用程序中,不是将默认的Mysql / Postgres ID列创建为Integers,而是在点击路径时很容易猜到下一个数字,生成ID列的最佳方法是什么(AlphaNumeric可能是?)很难猜到。

  

我做了一些关于创建UUID的研究,这是一个不错的选择吗?或者是   还有其他选择吗?

     

如何生成EPOCH时间戳并将其存储为ID   before_save回调每次?

1 个答案:

答案 0 :(得分:0)

使用UUID覆盖数据库ID是默默无闻的安全示例。

  

"系统安全不应该依赖于保密   实施或其组成部分。"    - 国家标准与技术研究所

考虑一下攻击者实际上可以利用他对主键的知识来攻击系统的情况 - SQL注入(你无论如何都被搞砸)和暴力攻击。你应该有更好的警卫。

据说存在使用UUID的有效用例 - 主要是使用顺序自动增量列的分布式数据库容易出现竞争条件。

如果你有几个"写"必须采取复制而不是广泛的步骤来确保ID同步,并且如果将记录同时插入不同的数据库中则会出现问题。

当生成唯一ID时,应使用具有低碰撞机会的散列算法。目前,RFC4122推荐使用SHA-1算法。早期的标准使用了一种方案,其中生成的计算机MAC地址与时间戳相结合,但这被认为不够透明1

MongoDB默认使用8位对象ID标识符 - 这与它构建为复制的事实有关。 MongoDB uses the following to construct its object IDs

  • 一个4字节的值,表示自Unix纪元以来的秒数,
  • 一个3字节的机器标识符,
  • 一个2字节的进程ID,
  • 一个3字节的计数器,以随机值开始。

请注意,这些是由数据库生成的 - 而不是使用数据库的Web服务器。

还有several esoteric algorithms旨在具有高唯一性,而无需指定密码哈希算法(如Blowfish)的费用。

结论:

如果您可以预见到您将遇到需要数据库重复的扩展问题,请使用UUID。

无论你使用什么算法都可能足够强大以避免pigeonhole problems - 但你不应该真正推出自己的问题 - 这个问题已经得到了广泛的研究,并且有一些解决方案可以免费提供许多工时。

安全收益充其量只是微不足道。