Я использую шифрование на уровне поля на стороне клиента MongoDB для шифрования и расшифровки данных. Однако я заметил, что каждый раз, когда я запускаю программу, примитивный двоичный ключ меняется. Это затрудняет получение ранее зашифрованных данных, поскольку я не могу расшифровать их с помощью нового ключа.
Есть ли способ поддерживать согласованный ключ шифрования для шифрования на уровне полей на стороне клиента в MongoDB? Если да, то как я могу это сделать?
https://go.dev/play/p/6W8e0OiPV2L
Я пытаюсь внедрить шифрование на уровне поля на стороне клиента в моем проекте сообщества MongoDB, чтобы зашифровать определенные поля в моих документах перед их сохранением в базе данных, а затем расшифровать их, когда я извлекаю их из базы данных.
Я следил за документацией MongoDB и смог успешно зашифровать и расшифровать данные во время первого выполнения моей программы. Однако я заметил, что ключ продолжает меняться каждый раз, когда я снова запускаю программу, и я хочу, чтобы ключ оставался неподвижным.
Эти строки должны быть удалены:
// Drop the Key Vault Collection in case you created this collection
// in a previous run of this application.
if err = Client.Database(keyVaultDb).Collection(keyVaultColl).Drop(context.TODO()); err != nil {
log.Fatalf("Collection.Drop error: %v", err)
}
А следующие строки нужны только тогда, когда ключ еще не существует:
dataKeyID, err := clientEnc.CreateDataKey(context.TODO(), provider, dataKeyOpts)
if err != nil {
log.Fatalf("CreateDataKey error: %v", err)
}
Возможно, сначала выполните вызов clientEnc.GetKeyByAltName
, чтобы проверить, существует ли ключ.
Говоря «изменение примитивного двоичного ключа», я думаю, вы имели в виду изменения ключа шифрования данных (DEK). Это вызвано удалением коллекции, в которой хранится DEK.
Смотрите Ключи и хранилища ключей:
Мастер-ключ клиента (CMK) — это ключ, который вы используете для шифрования ваших ключей шифрования данных (DEK)....
Ключ шифрования данных (DEK) — это ключ, который вы используете для шифрования полей в ваших документах MongoDB. Вы храните свой ключ шифрования данных в своей коллекции Key Vault в зашифрованном виде с помощью CMK....
Если вы удалите ключ шифрования данных (DEK), все поля, зашифрованные с помощью этого DEK, навсегда станут нечитаемыми.
Если вы удалите CMK, все поля, зашифрованные с помощью DEK, зашифрованных с помощью этого CMK, станут навсегда нечитаемыми.