如何在猫鼬模式中使用唯一属性和加密?

时间:2018-11-07 14:00:23

标签: node.js mongodb encryption mongoose cryptojs

我有一个MongoDB数据库,可以使用Mongoose通过NodeJS进行访问。我使用crypto模块使用加密来存储电子邮件地址。检索电子邮件地址时,我会解密数据库值。这是使用加密getter和setter的Mongoose模式的相关部分:

...
email: {
  type: Schema.Types.String,
  required: true,
  trim: true,
  unique: true, // <-- this does not work due to encryption
  set: value => this._encryption.encrypt(value),
  get: value => this._encryption.decrypt(value)
},
....

如您所见,该字段正在使用unique属性。但是由于加密,同一电子邮件地址的加密值始终是不同的。现在,我可以使用相同的电子邮件地址存储两个不同的用户,并且不会引发任何错误。

如何与unique字段属性一起使用加密?

1 个答案:

答案 0 :(得分:0)

我建议也许在模式之外进行加密/设置。 get方法仍然可以。

这样,您可以首先对进入的新电子邮件进行加密。

const encryptedEmail= _encryption.encrypt(email);

然后您可以进行搜索以确保此哈希不存在:

const email = await emailSchema.findOne({email: encryptedEmail});

if (!email.length) {
    emailSchema.create({ email: encryptedEmail});
}

这显然不如在架构中进行清理,但是它可以在静止时实现所需的加密。