在许多客户端和服务器上生成真正的全局唯一 ID总结详建议的解决方案关键问题
总结
闪存和/或javascript客户端中真正全局唯一的ID。我可以使用当前浏览器/闪存中可用的 RNG 执行此操作,还是必须构建具有服务器端随机性的复合 ID?
详
我需要为对象生成全局唯一标识符。我有多个用java编写的服务器端“系统”,需要能够交换ID;这些系统中的每一个都有一组 flex/javascript 客户端,这些客户端实际上为新对象生成 ID。我需要保证跨一组不相关系统的全局唯一性;例如,我需要能够合并/同步两个独立系统的数据库。我必须保证这些id之间永远不会发生冲突,并且一旦创建,我就永远不需要更改对象的ID。我需要能够在flash和javascript客户端中生成id,而无需为每个ID联系服务器。依赖于某些服务器提供的种子或系统 ID 的解决方案是可以的,只要不经常联系服务器即可。最好是完全断开连接的解决方案。同样,不需要预先注册系统的解决方案比依赖于中央机构(如 MAC 地址中的 OUI)的解决方案更可取。
我知道显而易见的解决方案是“使用UUID生成器”,例如闪存中的UIDUtil。此功能明确声明全局唯一性。总的来说,我担心依靠PRNG来保证全局唯一性。
建议的解决方案
完全依赖于客户端中的安全随机数生成器。
Flash 11+有flash.crypto.generateRandomBytes;Javascript有window.crypto,但它很新,在IE中不受支持。有像sjcl这样的解决方案,使用鼠标来添加熵。
我知道,给定一个完美的RNG,2122随机UID的碰撞可能性很小,但我担心我实际上不会在javascript或flash客户端中获得这种程度的随机性。我进一步担心,即使是加密RNG的典型用例也与我的不同:对于会话密钥等,只要攻击者无法预测,碰撞是可以接受的。就我而言,碰撞是完全不可接受的。我真的应该依靠安全 RNG 的原始输出来获得唯一 ID 吗?
生成包含系统、会话和对象 ID 的复合 ID。
一个明显的实现是在服务器安装时创建一个系统UUID,保留每个客户端登录会话ID(例如在数据库中),然后将系统和会话ID发送到客户端,该客户端将保留每个会话计数器。uid将是三重:系统ID,会话ID,客户端计数器。
我可以想象直接将它们连接起来,或者用加密哈希对它们进行哈希处理。我担心哈希本身可能会引入冲突,特别是如果哈希的输入与输出的大小大致相同。但是哈希会掩盖系统ID和可能泄漏信息的计数器。
另一种解决方案是使用一个中央注册表来分发唯一的系统 ID,而不是在安装时生成系统 ID,有点像 DOI 所做的。然而,这需要更多的协调,但我想这是真正保证全球一致性的唯一途径。
关键问题
- 基于随机还是基于复合?
- 是否包括系统 ID?
- 如果系统 ID:生成随机系统 ID 或使用中央注册表?
- 包括时间戳或其他随机数?
- 散列还是不散列?