使用Firebase的push()/ childByAutoID生成的名称的唯一性保证是什么?

时间:2014-01-07 22:30:05

标签: javascript ios security firebase

我想使用Firebase制作公众可读的数据,其位置很难猜测。因此,为了让某人能够访问存储在“element [element ID = X]”中的数据,我只想发送“X”,而不是发送“X”以及制作的安全令牌,以便他们访问对元素。 Firebase的push()childByAutoID似乎很自然:我可以授予所有单个元素的公共读取权限,但拒绝公开列表。我的代码将幸免于令牌和随机数生成。自动生成的ID应该是唯一的,因此很难猜测。

Firebase.js看,自动生成的ID的前8个字符基于当前时间戳,接下来的12个字符是使用Math.random()随机生成的。我假设iOS框架做了同样的事情,虽然我看不到代码,但是库链接到SecRandomCopyBytesarc4random

就我的目的而言,这看起来不错,但有没有人看过Firebase关于我们是否可以指望这种行为的指导?我不想构建代码,假设这些名称是相对较强的随机字符串,然后在升级到较新版本的Firebase时违反了该假设。

1 个答案:

答案 0 :(得分:4)

Firebase提供的自动生成ID的目的是允许开发人员以分布式方式创建按时间顺序排列的列表。它依赖于Math.random和时间戳来生成该客户端唯一的ID。

但是,如果您要将自动ID用作安全密钥,则可能不是最佳选择,具体取决于您希望系统的安全性。 Math.random是not a cryptographically secure random number generator,因为push()依赖它,所以它生成的ID也不是。

如果用户知道密钥,则允许用户访问Firebase中的某些数据,这是一个很好的概念。我们有example使用这种类型的安全规则,但我们不使用推送ID,而是使用内容本身的SHA-256哈希(在这种特殊情况下,它们是图像)。散列内容以生成密钥比依赖push()ID更安全。