我想使用 Firebase 制作位置难以猜测的公开可读数据。因此,为了让某人访问存储在“element [element ID = X]”中的数据,我只想向他们发送“X”,而不是向他们发送“X”以及为他们提供访问权限而制作的安全 token 到元素。 Firebase 的 push()
和 childByAutoID
似乎是天作之合:我可以授予对所有单个元素的公共(public)读取访问权限,但拒绝公开列表。我的代码将幸福地没有 token 和随机数生成。自动生成的 ID 应该是唯一的,因此应该很难猜到。
从看Firebase.js , 看起来自动生成的 ID 的前 8 个字符是基于当前时间戳的,接下来的 12 个字符是使用 Math.random()
随机生成的。我假设 iOS 框架做同样的事情,虽然我看不到代码,但库链接到 SecRandomCopyBytes
和 arc4random
。
就我的目的而言,这看起来已经足够好了,但是有没有人看到 Firebase 关于我们是否可以依靠这种行为的指导?我不愿意构建假设这些名称是相对强的随机字符串的代码,然后在我升级到更新版本的 Firebase 时违反该假设。
最佳答案
Firebase 提供的自动生成 ID 的目的是允许开发人员以分布式方式创建按时间顺序排列的列表。它依赖于 Math.random 和时间戳来生成该客户端唯一的 ID。
但是,如果您要使用自动 ID 作为安全 key ,这可能不是最好的主意,具体取决于您希望系统的安全程度。 Math.random 是 not a cryptographically secure random number generator由于 push() 依赖于它,因此它生成的 ID 也不是。
如果用户知道 key 是一个好的 key ,则允许用户访问 Firebase 中的某些数据的一般概念。我们有一个 example使用这种类型的安全规则,但我们不使用推送 ID,而是使用内容本身的 SHA-256 哈希(在这种特殊情况下,它们是图像)。散列内容以生成 key 比依赖 push() ID 更安全。
关于javascript - 使用 Firebase 的 push()/childByAutoID 生成的名称的唯一性保证是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20983313/