首頁 > 後端開發 > Golang > 主體

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

王林
發布: 2024-02-06 09:00:13
轉載
492 人瀏覽過

如何在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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!