本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon QLDB 中的資料驗證
重要
支援終止通知:現有客戶將可以使用 Amazon QLDB,直到 07/31/2025 的支援結束為止。如需詳細資訊,請參閱將 Amazon QLDB Ledger 遷移至 Amazon Aurora PostgreSQL
使用 Amazon QLDB,您可以信任應用程式資料變更的歷史記錄是準確的。QLDB 使用不可變的交易日誌,稱為日誌,用於資料儲存。日誌會追蹤您遞交資料的每個變更,並維護一段時間內完整且可驗證的變更歷史記錄。
QLDB 使用 SHA-256 雜湊函數搭配 Merkle 樹型模型,來產生日誌的密碼編譯表示法,稱為摘要。摘要可做為資料截至某個時間點整個變更歷史記錄的唯一簽章。您可以使用摘要來驗證文件修訂相對於該簽章的完整性。
主題
您可以在 QLDB 中驗證哪些類型的資料?
在 QLDB 中,每個分類帳只有一個日誌。日誌可以有多個股,它們是日誌的分割區。
注意
QLDB 目前僅支援具有單股的日誌。
區塊是在交易期間遞交至日誌鏈的物件。此區塊包含項目物件,代表交易產生的文件修訂。您可以在 QLDB 中驗證個別修訂或整個日誌區塊。
下圖說明此日誌結構。

圖表顯示交易會以包含文件修訂項目的區塊的形式遞交至日誌。它還顯示每個區塊都以雜湊鏈方式連結到後續區塊,並具有序號來指定其在鏈中的地址。
如需區塊中資料內容的資訊,請參閱Amazon QLDB 中的日誌內容。
什麼是資料完整性?
QLDB 中的資料完整性表示您分類帳的日誌實際上是不可變的。換言之,您的資料 (特別是每個文件修訂) 處於下列為 true 的狀態:
-
它存在於日誌中第一次寫入的相同位置。
-
自撰寫以來,它並未進行任何變更。
驗證如何運作?
若要了解驗證如何在 Amazon QLDB 中運作,您可以將概念分解為四個基本元件。
雜湊
QLDB 使用 SHA-256 密碼編譯雜湊函數來建立 256 位元雜湊值。雜湊可做為任意輸入資料量的唯一固定長度簽章。如果您變更輸入的任何部分,即使是單一字元或位元,輸出雜湊也會完全變更。
下圖顯示 SHA-256 雜湊函數為兩個僅因單一數字而不同的 QLDB 文件建立完全唯一的雜湊值。

SHA-256 雜湊函數是一種方式,這表示在數學上無法在指定輸出時運算輸入。下圖顯示,當指定輸出雜湊值時,無法計算輸入 QLDB 文件。

下列資料輸入會在 QLDB 中雜湊,以供驗證之用:
-
文件修訂
-
PartiQL 陳述式
-
修訂項目
-
日誌區塊
摘要
摘要是對某個時間點的分類帳整個日誌進行密碼編譯表示。日誌是僅附加的,日誌區塊會進行排序並雜湊鏈結,類似於區塊鏈。
您可以隨時請求分類帳的摘要。QLDB 會產生摘要,並以安全輸出檔案的形式傳回給您。然後,您可以使用該摘要來驗證先前時間點遞交之文件修訂的完整性。如果您以修訂開頭並以摘要結尾來重新計算雜湊,則證明您的資料之間沒有遭到變更。
Merkle 樹狀結構
隨著分類帳大小的增加,重新計算日誌的完整雜湊鏈以進行驗證變得越來越沒有效率。QLDB 使用 Merkle 樹模型來解決這種效率低下的問題。
Merkle 樹是樹狀資料結構,其中每個分葉節點代表資料區塊的雜湊。每個非分葉節點都是其子節點的雜湊。Merkle 樹通常用於區塊鏈,可協助您使用稽核驗證機制來有效驗證大型資料集。如需 Merkle 樹的詳細資訊,請參閱 Merkle 樹 Wikipedia 頁面
Merkle 樹的 QLDB 實作是從日誌的完整雜湊鏈建構而成。在此模型中,分葉節點是所有個別文件修訂雜湊集。根節點代表截至某個時間點的整個日誌摘要。
使用 Merkle 稽核驗證,您可以只檢查您分類帳修訂歷史記錄的一小部分,來驗證修訂。您可以透過將樹狀目錄從指定的分葉節點 (修訂版) 周遊到其根節點 (摘要) 來執行此操作。沿著此周遊路徑,您可以遞迴地雜湊分叉成對節點來運算其父雜湊,直到您結束摘要為止。此周遊具有樹狀目錄中log(n)
節點的時間複雜性。
證明
證明是 QLDB 針對特定摘要和文件修訂傳回的節點雜湊的排序清單。它由 Merkle 樹狀結構模型所需的雜湊組成,以將指定的葉節點雜湊 (修訂版) 鏈結至根雜湊 (摘要)。
在修訂和摘要之間變更任何遞交的資料會中斷日誌的雜湊鏈,並導致無法產生證據。
驗證範例
下圖說明 Amazon QLDB 雜湊樹模型。它顯示一組區塊雜湊,會彙總到頂部根節點,代表日誌鏈的摘要。在具有單鏈日誌的分類帳中,此根節點也是整個分類帳的摘要。

假設該節點 A 是包含您要驗證其雜湊的文件修訂的區塊。下列節點代表 QLDB 在您的證據中提供的雜湊順序清單:B、E、G。 這些雜湊是重新計算雜湊 A 摘要的必要項目。
若要重新計算摘要,請執行下列動作:
-
從雜湊 A 開始,並與雜湊 B 串連。 然後,雜湊運算 D 的結果。
-
使用 D 和 E 運算 F。
-
使用 F 和 G 計算摘要。
如果您的重新計算摘要符合預期值,則驗證會成功。假設修訂雜湊和摘要,無法對證據中的雜湊進行反向工程。因此,此練習證明您的修訂確實是相對於摘要撰寫在此日誌位置。
資料修訂如何影響驗證?
在 Amazon QLDB 中,DELETE
陳述式只會透過建立新的修訂,將其標記為已刪除,以邏輯方式刪除文件。QLDB 也支援資料修訂操作,可讓您永久刪除資料表歷史記錄中的非作用中文件修訂。
編輯操作只會刪除指定修訂中的使用者資料,並使日誌序列和文件中繼資料保持不變。修訂後,修訂中的使用者資料 (由data
結構表示) 會取代為新的dataHash
欄位。此欄位的值是已移除data
結構的 Amazon Ion 雜湊。如需詳細資訊和修訂操作的範例,請參閱 編輯文件修訂。
因此,分類帳會維護其整體資料完整性,並透過現有的驗證 API 操作以密碼編譯方式進行驗證。您仍然可以如預期般使用這些 API 操作來請求摘要 (GetDigest)、請求證明 (GetBlock 或 GetRevision),然後使用傳回的物件執行驗證演算法。
重新計算修訂雜湊
如果您計劃透過重新計算其雜湊來驗證個別文件修訂,您必須有條件地檢查修訂是否已修訂。如果修訂已修訂,您可以使用 dataHash
欄位中提供的雜湊值。如果未修訂,您可以使用 data
欄位重新計算雜湊。
透過執行此條件式檢查,您可以識別修訂版本並採取適當的動作。例如,您可以記錄資料操作事件以進行監控。
驗證入門
在驗證資料之前,您必須向分類帳請求摘要,並儲存以供稍後使用。在摘要涵蓋的最新區塊之前遞交的任何文件修訂,都有資格驗證該摘要。
然後,您向 Amazon QLDB 請求您要驗證之合格修訂的證明。使用此證明,您可以呼叫用戶端 API 來重新計算摘要,從修訂雜湊開始。只要先前儲存的摘要在 QLDB 之外已知且受信任,如果您的重新計算摘要雜湊符合儲存的摘要雜湊,即可證明文件的完整性。
重要
-
您特別證明的是,在您儲存此摘要的時間和執行驗證的時間之間,文件修訂版本並未變更。只要您想要稍後驗證的修訂已遞交至日誌,您就可以請求並儲存摘要。
-
最佳實務是建議您定期請求摘要,並將其存放在遠離分類帳的地方。根據您在分類帳中遞交修訂的頻率,決定您請求摘要的頻率。
如需詳細 AWS 部落格文章,討論實際使用案例內容中密碼編譯驗證的價值,請參閱使用 Amazon QLDB 進行真實世界密碼編譯驗證
。
如需如何從 分類帳請求摘要,然後驗證資料的step-by-step指南,請參閱以下內容: