我有一个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
字段属性一起使用加密?
答案 0 :(得分:0)
我建议也许在模式之外进行加密/设置。 get方法仍然可以。
这样,您可以首先对进入的新电子邮件进行加密。
const encryptedEmail= _encryption.encrypt(email);
然后您可以进行搜索以确保此哈希不存在:
const email = await emailSchema.findOne({email: encryptedEmail});
if (!email.length) {
emailSchema.create({ email: encryptedEmail});
}
这显然不如在架构中进行清理,但是它可以在静止时实现所需的加密。