Chr*_*son 12 javascript java flash guid
Flash和/或javascript客户端中真正全局唯一的ID.我可以使用当前浏览器/闪存中提供的RNG执行此操作,还是必须构建具有服务器端随机性的复合ID?
我需要为对象生成全局唯一标识符.我有多个用java编写的服务器端"系统",需要能够交换ID; 这些系统中的每一个都有一组flex/javascript客户端,它们实际上为新对象生成ID.我需要保证整个不相关系统的全球唯一性; 例如,我需要能够合并/同步两个独立系统的数据库.我必须保证这些id之间永远不会发生冲突,并且我永远不需要在创建后更改对象的id.我需要能够在flash和javascript客户端生成id而无需为每个id联系服务器.只要不经常联系服务器,依赖于某些服务器提供的种子或系统ID的解决方案就可以了.完全断开连接的解决方案是优选的.类似地,不需要预先注册系统的解决方案优于依赖于中央权限(例如MAC地址中的OUI)的解决方案.
我知道显而易见的解决方案是"使用UUID生成器",例如Flash中的UIDUtil.该功能特别否定全球唯一性.总的来说,我担心依靠PRNG来保证全球的独特性.
Flash 11+有flash.crypto.generateRandomBytes ; Javascript有window.crypto,但它很新,在IE中不受支持.像sjcl这样的解决方案使用鼠标来添加熵.
我知道,鉴于一个完美的RNG,2 122随机UID 碰撞的可能性很小,但是我担心我实际上不会在javascript或flash客户端中获得这种程度的随机性.我还担心即使是加密RNG的典型用例也与我的不同:对于会话密钥等,只要攻击者无法预测,冲突就是可以接受的.就我而言,碰撞是完全不可接受的. 我真的应该依靠安全RNG的原始输出来获取唯一ID吗?
一个明显的实现是在服务器安装时创建系统UUID,保持每个客户端登录会话ID(例如在数据库中),然后将系统和会话ID发送到客户端,这将保持每个会话计数器.uid将是三元组:系统ID,会话ID,客户端计数器.
我可以想象直接连接这些或用加密哈希对它们进行哈希处理.我担心散列本身可能会引入冲突,特别是如果散列的输入与输出大小相同.但哈希会掩盖系统ID和计数器,这可能会泄漏信息.
而不是在安装时生成系统ID,另一个解决方案是拥有一个中央注册表,分发出独特的系统ID,就像DOI所做的那样.然而,这需要更多的协调,但我认为这是真正保证全球统一的唯一方法.
最简单的答案是使用服务器分配的客户端 ID(针对每个客户端递增)以及每个客户端上的值(针对该客户端上的每个片段递增)。客户端 ID 和片段 ID 对成为该内容片段的全局唯一 ID。
另一种简单的方法是在服务器上生成一组唯一的 ID(一次 2k)并将它们批量发送到每个客户端。当客户端用完 ID 时,它会联系服务器以获取更多 ID。
客户端 ID 应存储在所有服务器均可访问的中央存储库中。
它可能有助于研究分布式散列方法,该方法用于在对等环境中唯一地识别和定位片段。考虑到您有一个可以干预以断言唯一性的服务器,这可能有点过分了。
要回答您的问题,您需要确定系统 ID、随机数或散列的复杂性增加会带来的好处。
系统 ID: 系统 ID 通常用于唯一标识域内的系统。因此,如果您不关心用户是谁,或者打开了多少个会话,而只想确保您知道设备是谁,那么请使用系统 ID。这在以用户为中心的环境(例如 JavaScript 或 Flash)中通常不太有用,因为用户或会话可能与这些环境相关。
Nonce: 随机数/盐/随机种子将用于混淆或以其他方式打乱 ID。当您不希望其他人能够猜测 ID 的原始值时,这一点很重要。如果这是必要的,那么最好使用私有加密密钥对 ID 进行加密,并将公共解密密钥传递给每个需要读取 ID 的消费者。
时间戳:考虑到客户端时钟的可变性(即您不能保证它遵循任何时间或时区),对于此应用程序,时间戳需要被视为伪随机值。
哈希:虽然哈希经常(滥用)用于创建唯一键,但它们的真正目的是将大(可能是无限)域映射到更小、更易于管理的域。例如,MD5 通常用于根据时间戳、随机数和/或随机数数据生成唯一 ID。实际发生的情况是,MD5 函数将无限范围的数据映射到 2^128 种可能性的空间中。虽然这是一个巨大的空间,但它并不是无限的,所以逻辑告诉你,将会有(即使只是在理论上)相同的哈希值分配给两个不同的片段。另一方面,完美散列尝试为每条数据分配一个唯一的标识符,但是,如果您只是开始为每个客户端片段分配一个唯一的标识符,那么这是完全没有必要的。