三、 背景知識與基本定義
我們假設使用者 C 想要上傳一筆病歷 F 至伺服器 S 上,其中 F 裡包含著 n 個欄位資 訊,記作 F=(F1,F2..,Fn)。
3.1 Keyed-hash Message Authentication Code(HMAC)
訊息驗證碼(message authentication code)是一段少量的資訊用來驗證訊息的完整性,
其中 HMAC 是一種有金鑰參與的雜湊函數(hash function),因為 HMAC 具有不可偽造 性(unforgeable),也就是說任兩個不同的訊息所做出來的 HMAC 值就不相同,所以也可 以當作訊息驗證碼使用。本篇使用的 HMAC 是使用有金鑰參與的 SHA-1 雜湊函數,我 們也利用 HMAC 的性質來做病歷欄位資訊的標籤。
3.2 Homomorphic Verifiable Tags(HVTs)
這部分我們會介紹 homomorphic verifiable tags(HVTs)以及如何將它應用到我們的架 構上。
給定一個病歷欄位資訊 Fi,我們用t𝑖表示為 Fi的 homomorphic verifiable tags,而這些 tag 都會跟病歷 F 一起儲存在伺服器 S 中。而這些 homomorphic verifiable tags 是給伺服 器 S 用來作證明所需要的資訊,它除了不可偽造性之外還有以下兩種性質:
Blockless verification:使用者 C 若只想知道病歷中的部分欄位資訊是否有被竄改,
他可以選擇特定幾種欄位資訊來做挑戰送給伺服器 S,讓伺服器只要證明這些特定的欄
3.3 Merkle Hash Tree
Merkle hash tree(MHT)是一種可用來做驗證的資料結構一、[8],它可以有效率地證 明一組元素是沒有被更動或破壞的。MHT 是一個二元樹,我們將驗證的元素放在葉子
-6-
端,不在葉子端的節點 hi 的值則是它的兩個子節點連結後帶入雜湊函數的結果,即 hi=H(h2i+1||h2i+2),其中 H 為一雜湊函數。按照此種方式計算二元樹的非葉子端節點的值 一直到根節點 hr。我們知道雜湊函數代入的參數不同,計算出來的結果也會不同,倘若 欲驗證的元素遭到竄改,所做出來的 MHT 的根節點 hr也必定與原先不同,因此驗證者 只 需 要 保 留 hr 即 可 驗 證 葉 子 端 的 元 素 , 圖 1 為 驗 證 的 一 個 例 子 。 假 設 資 料 為 {𝑥1 𝑥2 …, 𝑥8 },而驗證者只擁有根節點值 𝑟。此時驗證者向證明者要求證明其中{𝑥1 𝑥6} 是否正確,證明者便需要提供𝑥1 𝑥6以及對應的輔助驗證資訊(auxiliary authentication information) Ω1 = (𝑥2 𝑑),Ω6 = (𝑥5 𝑓)給驗證者。驗證者首先計算 𝑐 = h(𝑥1||𝑥2),
𝑒 = h(𝑥5||𝑥6),接著計算 𝑎 = h( 𝑐|| 𝑑), 𝑏 = h( 𝑒|| 𝑓),最後計算 ′𝑟 = h( 𝑎|| 𝑏)後,
比較 ′𝑟與原先儲存的 𝑟是否一樣,若是一樣則驗證{𝑥1 𝑥6}成功。
圖 1 Merkle Hash Tree 範例
3.4 系統模型
我們考慮的驗證系統如圖 2 所示,包括使用者以及不可信任的伺服器。使用者可以 新增病歷到伺服器中,並且能存取伺服器中所屬的電子病歷。使用者可透過送出挑戰至 伺服器驗證在伺服器中的電子病歷完整性。我們所提出的架構是由五個演算法
(KeyGen,TagGen,ChallGen,GenProof,CheckProof)所建造而成,接下來部份我們會定義這
-7-
五個演算法。表格 1 是我們架構中會用到的符號表示。
圖 2 系統概觀
表格 1 符號表示及意義
符號 代表意義
ℎ HMAC 的機密金鑰 使用者端的機密係數
H(.) 無金鑰參與的密碼的雜湊函數,如 SHA-1
𝐻𝑘(. ) 有金鑰 k 參與的密碼的雜湊函數,如 HMAC-SHA-1 F 病歷欄位資訊的集合
T 病歷欄位資訊的標籤集合 病歷欄位資訊的雜湊值集合 n 病歷欄位個數
V 病歷欄位的版本編號集合,是用來記錄欄位更新次數
𝑟𝑜𝑜𝑡 MHT 的根節點的值
KeyGen(1k) → ( ℎ, )
是一個由使用者執行的金鑰產生演算法,將安全參數 k 輸入後,得到機密金鑰 ℎ以 及機密係數 後將兩個值保存在使用者端,目的是為了製作標籤使用。
TagGen(F, ℎ ) → (T, ,V, 𝑟𝑜𝑜𝑡)
是一個由使用者執行的標籤產生演算法,輸入參數為病歷 F,機密金鑰 ℎ以及機 密係數 。此演算法是對每一個病歷欄位資訊 𝐹𝑖,透過 ℎ,對應的版本號𝑣𝑖,索引 i 以及 計算出標籤 𝑖。除此之外,根據欄位索引和版本編號代入𝐻𝑠𝑘ℎ(. )得到的雜湊值𝑤𝑖, 我們利用這些雜湊值{𝑤𝑖}建造 MHT,並且保留根節點的值 𝑟𝑜𝑜𝑡。最後輸出結果為
-8-
T={ 𝑖}𝑖∈[1 𝑛], ={𝑤𝑖}𝑖∈[1 𝑛],V = {𝑣𝑖}𝑖∈[1 𝑛]以及 𝑟𝑜𝑜𝑡,之後使用者會將(F,T, , V)上傳至 伺服器,而 𝑟𝑜𝑜𝑡會保留在使用者端。
ChallGen(n) → C
是一個由使用者執行的挑戰產生演算法,輸入參數為病歷欄位個數 n,根據 n 隨機 輸出挑戰 C。
ProofGen(F,T, ,C) →
是一個由伺服器執行的證明產生演算法,輸入參數為病歷 F,標籤集合 T,雜湊值 集合 以及挑戰 C,伺服器根據這些值計算出證明 P,證明它擁有這些欄位資訊。最後 將 P 傳給使用者驗證。
CheckProof( ℎ, , 𝑟𝑜𝑜𝑡,C,P) → 0/1
是一個由使用者執行的驗證演算法,輸入參數為機密資訊 ℎ,機密係數 ,根節點 值 𝑟𝑜𝑜𝑡,挑戰 C 以及伺服器計算的證明 P,根據這些資訊輸出驗證結果,若驗證成功 輸出 1,反之輸出 0 代表驗證失敗。
3.5 安全模型
我們假設伺服器是不可信任的情形下,伺服器可能會有下列幾種攻擊[6]:
Replace Attack. 當伺服器把𝐹𝑙刪除時,它可能會挑選另一組合法的(𝐹𝑘 𝑤𝑘 𝑘)來取代 被挑戰的(𝐹𝑙 𝑤𝑙 𝑙)來做證明。
Forge Attack. 當伺服器把𝐹𝑙刪除時,它可能會偽造𝐹𝑘 ≠ 𝐹𝑙的合法標籤企圖欺騙使用 者。