Как использовать уникальный атрибут наряду с шифрованием в схеме Мангуста? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть база данных MongoDB, к которой я обращаюсь через NodeJS, используя Mongoose. Я использую шифрование для хранения адресов электронной почты, используя модуль crypto. При получении адреса электронной почты я расшифровываю значение базы данных. Вот соответствующая часть схемы 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 голосов
/ 07 ноября 2018

Я бы посоветовал выполнить шифрование / настройку вне схемы. Метод get все равно будет в порядке.

Таким образом, вы можете сначала зашифровать приходящее новое письмо.

const encryptedEmail= _encryption.encrypt(email);

Затем вы можете выполнить поиск, чтобы убедиться, что этот хэш не существует:

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

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

Очевидно, что это не так чисто, как если бы вы делали это внутри схемы, однако это дало бы желаемое шифрование в состоянии покоя.

...