在Rails应用程序中,不是将默认的Mysql / Postgres ID列创建为Integers,而是在点击路径时很容易猜到下一个数字,生成ID列的最佳方法是什么(AlphaNumeric可能是?)很难猜到。
我做了一些关于创建UUID的研究,这是一个不错的选择吗?或者是 还有其他选择吗?
如何生成EPOCH时间戳并将其存储为ID before_save回调每次?
答案 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:
请注意,这些是由数据库生成的 - 而不是使用数据库的Web服务器。
还有several esoteric algorithms旨在具有高唯一性,而无需指定密码哈希算法(如Blowfish)的费用。
如果您可以预见到您将遇到需要数据库重复的扩展问题,请使用UUID。
无论你使用什么算法都可能足够强大以避免pigeonhole problems - 但你不应该真正推出自己的问题 - 这个问题已经得到了广泛的研究,并且有一些解决方案可以免费提供许多工时。
安全收益充其量只是微不足道。