MongoDB的ObjectIds是如何生成的?

24 浏览
0 Comments

MongoDB的ObjectIds是如何生成的?

它们有些随机吗?\n我的意思是……人们能够分解它们吗?

0
0 Comments

如何生成MongoDB的ObjectIds?

MongoDB的ObjectIds通常是由驱动程序在客户端生成的。例如,在Ruby中,可以使用BSON::ObjectID来生成ObjectIds:

require 'bson'
id = BSON::ObjectId.new

你也可以自己生成ObjectIds。这在使用业务标识符时特别有用。

ObjectIds的可预测性

当使用驱动程序生成的ObjectIds时,它们的可预测性较低。但是,当使用自己的业务标识符时,可预测性会稍微增加,取决于它们的可预测性(例如登录、连续标识符等)。

如果有相关的ObjectIds可供分析,它们是可以被预测的。但是,相对于传统数据库中的自增列,猜测它们要困难得多。

是的,自增Id更容易被猜测,但MongoDB的ObjectId不能被认为是安全的。由于它们不是随机的且可以容易地分解,你可以在mongo shell中使用ObjectId().getTimestamp()命令来查看它们的创建时间。

那么,使用UUID是否会提供更多的唯一性?使用这种算法似乎不可能生成重复的id...那么“机器”id是从哪里来的呢?

0
0 Comments

MongoDB的ObjectIds是由以下几个部分组成的:秒数、机器标识、进程ID和计数器。其中,秒数表示生成ObjectId的时间,机器标识表示生成ObjectId的机器,进程ID表示生成ObjectId的进程,计数器表示生成ObjectId的顺序。

如果拥有足够多的ObjectIds,它们会泄露关于基础架构的许多信息。您还可以了解到每个对象的创建日期,例如您有多少台服务器,每台服务器运行了多少个进程。

为了避免ObjectId泄露过多的信息,可以考虑使用自定义的id生成方法,或者对ObjectId进行加密处理,以减少信息的暴露。

以下是一个生成ObjectId的示例代码(使用JavaScript实现):

function ObjectIdDetails (id) {
    return {
        seconds: parseInt(id.slice(0, 8), 16),
        machineIdentifier: parseInt(id.slice(8, 14), 16),
        processId: parseInt(id.slice(14, 18), 16),
        counter: parseInt(id.slice(18, 24), 16)
    };
}

以上是关于MongoDB的ObjectIds生成方式的讨论,以及可能导致信息泄露的问题和解决方法。

0
0 Comments

MongoDB的ObjectIds是如何生成的呢?这个问题的出现是因为他们不是随机生成的,可以很容易地被预测出来。根据官方文档中的说明,一个BSON ObjectID是由12个字节组成的,包括一个4字节的时间戳(自纪元以来的秒数),一个3字节的机器ID,一个2字节的进程ID以及一个3字节的计数器。

然而,需要注意的是,引用的链接文档与引用的内容不再一致——它提到了“一个5字节的随机值”,而不是使用“id”值。因此,实际上,这个ObjectID由一个32位的时间戳和一个64位的随机初始化的计数器连接而成。然而,结论是相同的:如果你拥有来自同一系统的有效值,那么很容易猜出其他的ObjectId值。

解决这个问题的方法是确保在生成ObjectId时使用随机的机器ID、进程ID和计数器。这样可以减少ObjectId的可预测性,增强安全性。

以下是一个示例代码,展示了如何使用Python中的pymongo库生成随机的ObjectId:

import pymongo
from bson.objectid import ObjectId
# 连接到MongoDB数据库
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
collection = db["mycollection"]
# 生成随机的ObjectId
random_object_id = ObjectId()
# 将随机ObjectId插入到集合中
collection.insert_one({"_id": random_object_id})
# 打印插入的文档
print(collection.find_one({"_id": random_object_id}))

通过使用随机生成的ObjectId,我们可以确保更高的安全性和隐私保护,防止未经授权的访问和猜测。

0