Javascript Firebase';生成的名称的唯一性保证是什么;s push()/childByAutoID?

Javascript Firebase';生成的名称的唯一性保证是什么;s push()/childByAutoID?,javascript,ios,security,firebase,Javascript,Ios,Security,Firebase,我想使用Firebase制作位置难以猜测的公开可读数据。因此,为了让某人能够访问存储在“element[element ID=X]”中的数据,我只想向他们发送“X”,而不是向他们发送“X”以及一个为让他们能够访问该元素而特制的安全令牌。Firebase的push()和childByAutoID看起来很自然:我可以授予对所有单个元素的公共读取权限,但拒绝公开列表。我的代码将是幸福的令牌和随机数生成免费。自动生成的ID应该是唯一的,因此应该很难猜测 通过查看,自动生成的ID的前8个字符似乎基于当前时

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

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


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

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

但是,如果您打算使用自动ID作为安全密钥,这可能不是最好的主意,这取决于您希望系统的安全程度。Math.random是,由于push()依赖于它,因此它生成的ID也不是


不过,让用户访问Firebase中某些数据(如果他们知道密钥)的一般概念是好的。我们有一种使用这种类型的安全规则的方法,但是我们没有使用推送ID,而是使用内容本身的SHA-256散列(在这个特定的例子中,它们是图像)。散列内容以生成密钥比依赖push()ID更安全。

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

但是,如果您打算使用自动ID作为安全密钥,这可能不是最好的主意,这取决于您希望系统的安全程度。Math.random是,由于push()依赖于它,因此它生成的ID也不是


不过,让用户访问Firebase中某些数据(如果他们知道密钥)的一般概念是好的。我们有一种使用这种类型的安全规则的方法,但是我们没有使用推送ID,而是使用内容本身的SHA-256散列(在这个特定的例子中,它们是图像)。散列内容以生成密钥比依赖push()ID更安全。

push()ID的规范在任何地方都有说明吗?从几个方面来看,它似乎总是有20个字符长,以“-”开头,剩下的19个字符可以是[a-Z][a-Z][0-9]和“-”。还有什么吗?问得好,别担心。我很想知道答案。e、 例如,我可以一直使用破折号前缀吗?除了它是一个有效的Firebase密钥之外,不能保证push ID的格式,而且对push()的后续调用将按时间顺序排列ID。理想情况下,应用程序应该已经知道使用推送ID的路径——不建议在同一路径中将推送ID与自定义密钥名称混合使用。如果您有兴趣了解这些ID是如何生成的,这篇博文可能会很有用:推送()ID的规范是否在任何地方都有详细说明?从几个方面来看,它似乎总是有20个字符长,以“-”开头,剩下的19个字符可以是[a-Z][a-Z][0-9]和“-”。还有什么吗?问得好,别担心。我很想知道答案。e、 例如,我可以一直使用破折号前缀吗?除了它是一个有效的Firebase密钥之外,不能保证push ID的格式,而且对push()的后续调用将按时间顺序排列ID。理想情况下,应用程序应该已经知道使用推送ID的路径——不建议将推送ID与同一路径上的自定义密钥名称混合使用。如果您有兴趣了解这些ID是如何生成的,这篇博文可能会很有用: