首页 > 解决方案 > 如何在猫鼬模式中使用唯一属性和加密?

问题描述

我有一个 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字段属性一起使用?

标签: node.jsmongodbencryptionmongoosecryptojs

解决方案


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

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

const encryptedEmail= _encryption.encrypt(email);

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

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

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

这显然不像在模式中那样干净,但是它可以实现所需的静态加密。


推荐阅读