简而言之,不。蒙戈ObjectIds
很容易猜到。特别是,在高负载下,这些通常是连续的数字,因为时间戳、机器和进程 ID 不会改变。如果你看Objectid的结构 http://docs.mongodb.org/manual/core/object-id/,它们由
a 4-byte timestamp,
a 3-byte machine identifier,
a 2-byte process id, and
a 3-byte counter, starting with a random value.
因此,它们的随机性很小。我经常在数据库中看到连续的 ID,例如,如果某个控制器操作快速连续写入域对象和日志条目。
如果可以猜测时间戳并且可以确定机器 ID(除非您有一个巨大的集群),则只剩下 5 个字节。通过查看许多生成的 id,我可能可以将其减少到 50 个进程,因此有效熵在 28 位范围内。这仍然很难猜测,但对于访问令牌来说风险太大。
请改用加密强度高的伪随机数生成器,并从中创建令牌。例如,在 .NET 中,RNGCryptoServiceProvider
允许创建任意长度的随机数据。
附带说明一下,我建议在 OAuth 令牌周围添加一个额外的加密包装器,原因有两个:
a) 您希望能够快速确定无效令牌。有效的加密 shell 可能仍包含无效令牌(已撤销或过期的授权),但您不必每次都通过暴力攻击攻击数据库。另外,客户
b) 客户端可以一遍又一遍地请求令牌。虽然这不是必需的,但我知道的几乎所有系统每次都会返回不同的令牌(无论它们是否自我验证)。通常,这是因为令牌本身的有效期有限。这与 OAuth 授权的有效期不同。
在数据库中,您真正想要存储的是授予,即某个用户授予某个客户端的权限。如果删除此授予,所有令牌都将变得无效。每次插入新令牌非常不方便,因为用户必须删除所有令牌才能有效删除应用程序授权。