第四章、 系統設計
4.2 加密資料上執行讀與寫
加密資料上執行 SQL 查詢時,一樣可以使用大家所熟悉的 SQL 查詢指令。差別在 於使用者一開始建立資料表時,要決定之後此資料表中的哪一個欄位資料要做完整性檢 查驗證,而 SQL 查詢指令中,想要完整性驗證的欄位名稱及資料型態之間增加一個 ic
指令。之後使用者插入資料到此資料表時,對應到有著 ic 指令欄位的資料會被加密及產 生完整性檢查所需要的相關資訊。系統利用相等的比對方式,搜尋資料。假設 SQL 查 詢為“select * from book;”時,代理伺服器會把 book 資料表中的所有資料回傳回來。其中 把資料加密的部分,解密成明文回傳,並且驗證加密資料的完整性。如果 SQL 查詢為
“select * from book where filename=‘file.txt’;”時,代理伺服器會回傳 filename 等於 file.txt 的那一筆資料,此時也會一樣回傳資料的完整性驗證結果。
create table book(filename text, filedata ic text);
代理伺服器收到 SQL 查詢指令後檢查到 filedata 欄位中有著 ic( integrity check )指令時,
增加兩個儲存 IV(initialization vector)及認證碼( integrity_tag )的欄位,如圖 6( b ) 所示。
IV 的欄位名稱命名為要檢查完整性的欄位名稱 ( filedata ) 加上 salt,認證碼欄位則 integrity_tag。SQL 查詢指令中也可以有多個欄位同時檢查資料的完整性,也就是可以在 多個欄位中有 ic 指令的出現。
資料插入到資料表時,插入資料的 SQL 查詢指令與一般 SQL 查詢指令一樣為 insert into book values (‘file.txt’, ‘test’ );
代理伺服器會利用 filedata 欄位的內容及相關金鑰產生認證碼,且利用自己的 master
book book
(a) (b)
filename filedata filedatasalt integrity_tag file.txt XXXXX 12345678 OOOOO
filename filedatafile.txt test
key,加密 filedata 欄位的內容。最後密文資料及認證碼分別存回 SQL 查詢封包的 filedata 欄位及新增加的認證碼欄位。加密資料時,系統使用 AES-CBC mode,而加密使用到的 IV( initialization vector )以亂數產生並寫到 filedatasalt 欄位、最後認證碼存入 integrity_tag 的欄位,filedata 及 integrity_tag 的內容儲存成 BLOB 型態的檔案,圖 6( b ) 中的 XXXXX 以 BLOB 型態儲存的 filedata 檔案以及 OOOOO 以 BLOB 型態儲存的 integrity_tag 檔案。
4.2.2 執行讀取查詢
使用者想要檢查資料完整性時,傳送 SQL 查詢指令到代理伺服器。檢查完整性資 料的 SQL 查詢指令為
select * from book where filename=‘file.txt’;
資料庫接收到 SQL 查詢指令後用相等的方式比對,回傳 filename 等於 file.txt 的那筆資 料。代理伺服器接收到符合 SQL 查詢封包的資料後先解密 filedata 欄位的內容,利用解 密的結果及認證碼產生證明碼,為了防止重送攻擊,參與計算證明碼的 challenge 每次 以亂數方式產生。最後檢查證明瑪,驗證資料的完整性,檢查結果傳到 Web server。Web server 以網頁訊息視窗方式顯示驗證結果。如果使用者想要下載資料時,把解密後的結 果,以檔案方式傳送給 Web server。
使用者想要動態的更新或是修改資料時,SQL 查詢指令為
update book set filedata=‘testtest’ where filename=‘file.txt’;
代理伺服器收到 SQL 更新指令時,與插入或是上傳指令一樣利用 filedata 欄位的新資料 ( ‘testtest’ )產生認證碼。接著利用自己的 master key 加密新資料後新資料以及認證碼上 傳並覆蓋 file.txt 檔案的內容。
如果使用者想要刪除資料時,SQL 查詢指令為
delete from book where filename=‘file.txt’;
代理伺服器接收到刪除資料指令時,把 SQL 查詢封包改寫成自訂的資料欄位格式後把 查詢送給資料庫。最後資料庫會刪除 filename 等於 file.txt 的那筆資料。所有 SQL 查詢 中,filename 的欄位可以作為 primary key 的角色,以便讓使用者能夠查詢資料。