Java 跨多个客户端和服务器生成真正的全局唯一id 总结

Java 跨多个客户端和服务器生成真正的全局唯一id 总结,java,javascript,flash,guid,Java,Javascript,Flash,Guid,flash和/或javascript客户端中真正全局唯一的ID。我可以使用当前浏览器/flash中可用的RNG来实现这一点,还是必须构建一个具有服务器端随机性的复合ID 细节 我需要为对象生成全局唯一标识符。我有多个用java编写的服务器端“系统”,需要能够交换ID;这些系统中的每一个都有一组flex/javascript客户机,它们实际生成新对象的id。我需要在一组不相关的系统中保证全局唯一性;例如,我需要能够合并/同步两个独立系统的数据库。我必须保证这些id之间不会发生冲突,并且在创建对象后

flash和/或javascript客户端中真正全局唯一的ID。我可以使用当前浏览器/flash中可用的RNG来实现这一点,还是必须构建一个具有服务器端随机性的复合ID

细节 我需要为对象生成全局唯一标识符。我有多个用java编写的服务器端“系统”,需要能够交换ID;这些系统中的每一个都有一组flex/javascript客户机,它们实际生成新对象的id。我需要在一组不相关的系统中保证全局唯一性;例如,我需要能够合并/同步两个独立系统的数据库。我必须保证这些id之间不会发生冲突,并且在创建对象后,我永远不需要更改对象的id。我需要能够在flash和javascript客户端中生成id,而不必为每个id联系服务器。只要不经常联系服务器,依赖服务器提供的种子或系统id的解决方案就可以了。最好采用完全断开连接的解决方案。类似地,不需要预先注册系统的解决方案比依赖中央机构(如MAC地址中的OUI)的解决方案更可取

我知道显而易见的解决方案是“使用UUID生成器”,比如flash中的UIDUtil。此函数明确否认全局唯一性。总的来说,我担心依靠PRNG来保证全球的独特性

提议的解决办法 完全依赖客户端中的安全随机数生成器。 flash11+has;Javascript有window.crypto,但它是非常新的,在IE中不受支持。有类似的解决方案,使用鼠标添加熵

我知道,给定一个完美的RNG,2122随机UID发生碰撞的可能性很小,但我担心我不会在javascript或flash客户端中获得这种程度的随机性。我更担心的是,即使是加密RNG的典型用例也与我的不同:对于会话密钥等,冲突是可以接受的,只要攻击者无法预测它们。就我而言,碰撞是完全不可接受的。我真的应该依靠安全RNG的原始输出来获得唯一的ID吗?

生成包含系统、会话和对象ID的复合ID。 一个明显的实现是在服务器安装时创建一个系统UUID,保留每个客户端登录会话id(例如在数据库中),然后将系统和会话id发送给保留每个会话计数器的客户端。uid将是三重:系统ID、会话ID、客户端计数器

我可以想象直接将它们连接起来,或者用加密散列对它们进行散列。我担心散列本身可能会引入冲突,特别是当散列的输入与输出大小相同时。但是散列会掩盖系统id和计数器,这可能会泄露信息。

与在安装时生成系统ID不同,另一种解决方案是使用一个中央注册表来分发唯一的系统ID,有点像DOI所做的。然而,这需要更多的协调,但我想这是真正保证全球统一性的唯一途径

关键问题
  • 随机的还是复合的
  • 包括系统ID
  • 如果系统id:生成随机系统id或使用中央注册表
  • 包括时间戳或其他临时标记
  • 散列还是不散列

最简单的答案是使用服务器分配的客户端ID,该ID为每个客户端递增,而每个客户端上的值为该客户端上的每个片段递增。客户端ID和片段ID对成为该内容的全局唯一ID

另一种简单的方法是在服务器上生成一组唯一的ID(比如每次2k),并将它们成批发送给每个客户机。当客户端的ID用完时,它会与服务器联系以获取更多信息

客户端ID应该存储在所有服务器都可以访问的中央存储库中

它可能有助于寻找用于在对等环境中唯一标识和定位片段的方法。考虑到您有一个可以进行干预以断言唯一性的服务器,这可能有些过分

要回答您的问题,您需要确定增加的系统ID、nonce或哈希的复杂性将带来什么好处

系统ID: 系统ID通常用于唯一标识域中的系统。因此,如果您不关心用户是谁,也不关心打开了多少个会话,而只想确保您知道设备是谁,那么请使用系统ID。在以用户为中心的环境中,如JavaScript或Flash中,这通常不太有用,因为用户或会话可能与此相关

Nonce: nonce/salt/random种子将用于混淆或以其他方式扰乱ID。当您不希望其他人能够猜测ID的原始值时,这一点很重要。如果这是必要的,则最好使用专用加密密钥加密ID,并将公共解密密钥传递给需要读取ID的每个消费者

时间戳:考虑到客户端时钟的可变性(即您不能保证它遵守任何时间或时区),时间戳需要被视为此应用程序的伪随机值

散列:虽然散列通常(ab)用于创建唯一密钥,但它们的真正目的是将一个大的(可能是无限的)域映射到一个更小、更易于管理的域。例如,MD5通常用于从时间戳、随机数和/或nonce数据生成唯一ID。实际上,MD5函数正在将无限范围的数据映射到2^128个可能性的空间中。虽然这是一个巨大的空间,但它不是无限的,所以逻辑告诉你
[server id][client id][request id]