我知道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更新对象和维护加密策略?
答案 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。
由于数据在数据库中不可见,因此似乎可以按预期工作。