mongoose-加密和更新对象

时间:2015-05-07 15:18:53

标签: node.js mongodb encryption mongoose

我知道mongoose-encryption doc声明:

  

更新将在未加密和未经身份验证的字段上正常工作,但如果涉及加密或经过身份验证的字段,则无法正常工作。

我观察到当我使用mongoose create方法时,我的字段被加密到_ct字段中。但是,如果我然后使用findByIdAndUpdate更新我的对象,我会看到字段是以纯文本形式创建的(通过find命令从mongodb控制台输出)。

自保存

> db.tenants.find().pretty()
{
    "_id" : ObjectId("554b7f8e7806c204e0c7589e"),
    "_ac" : BinData(0,"YdJjOUJhzDWuDE5oBU4SH33O4qM2hbotQTsF6NzDnx4hWyJfaWQiLCJfY3QiXQ=="),
    "_ct" : BinData(0,"YaU4z/UY3djGCKBcgMaNIFHeNp8NJ9Woyh9ahff0hRas4WD80V80JE2B8tRLUs0Qd9B7IIzHsq6O4pYub5VKJ1PIQA+/dbStZpOH/KfvPoDC6DzR5JdoAu+feU7HyFnFCMY81RZeJF5BKJylhY1+mG4="),
    "__v" : 0
}

findByIdAndUpdate

之后
> db.tenants.find().pretty()
{
    "_id" : ObjectId("554b7f8e7806c204e0c7589e"),
    "_ac" : BinData(0,"YdJjOUJhzDWuDE5oBU4SH33O4qM2hbotQTsF6NzDnx4hWyJfaWQiLCJfY3QiXQ=="),
    "_ct" : BinData(0,"YaU4z/UY3djGCKBcgMaNIFHeNp8NJ9Woyh9ahff0hRas4WD80V80JE2B8tRLUs0Qd9B7IIzHsq6O4pYub5VKJ1PIQA+/dbStZpOH/KfvPoDC6DzR5JdoAu+feU7HyFnFCMY81RZeJF5BKJylhY1+mG4="),
    "__v" : 0,
    "userId" : ObjectId("55268f43cbfc87be221cd611"),
    "social" : "123-45-6789",
    "last" : "bar",
    "first" : "foo"
}

是否建议使用mongoose-encryption更新对象和维护加密策略?

2 个答案:

答案 0 :(得分:0)

正如您所引用的,mongoose-encryption的文档清楚地表明它不适用于更新。

https://github.com/joegoldbeck/mongoose-encryption

Mongoose更新钩子也有点棘手。

你可以做的事情是以这样一种方式为你的集合建模,即需要加密的字段是一个单独的集合,而在paren集合中只需通过id链接它们。

Person = {
  _id: <ObjectId>
  name: Blah
  ..
  ..
  documents: [
    { 'doc_id': <ObjectId1> },
    { 'doc_id': <ObjectId2> },
  ]
}

Documents = [
{
    "_id" : <ObjectId1>,
    "_ac" : BinData(0,"YdJjOUJhzDWuDE5oBU4SH33O4qM2hbotQTsF6NzDnx4hWyJfaWQiLCJfY3QiXQ=="),
    "_ct" : BinData(0,"YaU4z/UY3djGCKBcgMaNIFHeNp8NJ9Woyh9ahff0hRas4WD80V80JE2B8tRLUs0Qd9B7IIzHsq6O4pYub5VKJ1PIQA+/dbStZpOH/KfvPoDC6DzR5JdoAu+feU7HyFnFCMY81RZeJF5BKJylhY1+mG4="),
    "__v" : 0
}
...
...
]

这也会增加代码重用。

答案 1 :(得分:0)

我实施了一种我认为不是最有效的策略,但它确实有效。

我需要对数据库中的所有数据进行加密,以便我不能使用上述方法。

我所做的是创建一个更新函数,该函数查找要修改的文档,然后构造一个新的架构对象,并将找到的文档的_id关联到新对象。 然后,我删除了原始文档,然后保存了具有原始_id的新对象。我发现的唯一问题是猫鼬抛出一个错误,因为控制台中打印了重复的_id,但它仍然可以工作,并且_id没有重复。

我尝试替换the_id并使用另一个属性来移动文档,但仍然会抛出该错误,无论如何数据都按预期存储。

useCallback

更新2020年7月29日 我发现,如果您使用具有相同_id的save方法,则数据将以加密方式存储,但是Mongo会创建您的架构结构,但所有值均设置为null。

由于数据在数据库中不可见,因此似乎可以按预期工作。