首頁  >  文章  >  後端開發  >  如何在MongoDB客戶端欄位級加密中保持一致的加密金鑰?

如何在MongoDB客戶端欄位級加密中保持一致的加密金鑰?

王林
王林轉載
2024-02-06 09:00:13494瀏覽

如何在MongoDB客戶端欄位級加密中保持一致的加密金鑰?

問題內容

我正在使用 MongoDB 用戶端字段層級加密來加密和解密資料。但是,我注意到每次執行程式時,原始二進位金鑰都會變更。這使得我很難檢索以前加密的數據,因為我無法使用新密鑰對其進行解密。

有沒有辦法在 MongoDB 中維護客戶端欄位級加密的一致加密金鑰?如果可以,我該怎麼做?

https://www.mongodb.com/docs/manual/core/csfle/fundamentals/manual-encryption/#std-label-csfle-fundamentals-manual-encryption

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 文件中的欄位的金鑰。您將資料加密金鑰儲存在使用 cmk 加密的 key vault 集合中...

如果您刪除資料加密金鑰 (dek),則使用該 dek 加密的所有欄位將永久無法讀取。

如果您刪除 cmk,則使用該 cmk 加密的 dek 加密的所有欄位將永久無法讀取。

以上是如何在MongoDB客戶端欄位級加密中保持一致的加密金鑰?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除