node.js - 如何在猫鼬模式中使用唯一属性和加密?
问题描述
我有一个 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
字段属性一起使用?
解决方案
我建议也许在架构之外进行加密/设置。get 方法仍然可以。
这样,您可以首先加密进来的新电子邮件。
const encryptedEmail= _encryption.encrypt(email);
然后您可以进行搜索以确保此哈希不存在:
const email = await emailSchema.findOne({email: encryptedEmail});
if (!email.length) {
emailSchema.create({ email: encryptedEmail});
}
这显然不像在模式中那样干净,但是它可以实现所需的静态加密。
推荐阅读
- excel - VBA使用偏移量基于查找表查找和替换单元格内容
- c# - Webhook 调用失败。错误:无法解析 webhook JSON 响应:找不到字段:消息中的 ETag
- entity-framework - EF 核心中模型构建器中实体的命名空间
- python - python中的if语句,简写
- go - 如何在入站请求结束后派生可以使用的上下文?
- java - 使用锁的 Java 并发
- python - 使用带有大于号的 Django 调用命令作为参数
- python-3.x - Networkx 中的图联合
- php - 我是 PHP 新手,但在使用响应式电子邮件表单时遇到问题
- python - Pandas 替换每列中的某些值