前兩天我們很快的帶過應用程式弱點和原始碼檢測的議題,今天回到資料安全性的主線上,在資訊安全的精神中,除了機密性與可用性,還有一個很重要的課題就是資料完整性(data integrity),我們來複習檔案傳輸時的完整性保護。
我們先用C#程式建立出一個測試檔案:
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\temp\transaction.txt", true))
{
file.WriteLine("4567-1111-2222-3333,高雄台鋁生活商場,1000");
file.WriteLine("4567-1111-2222-3333,台北微風信義分店,2000");
file.WriteLine("5567-1111-2222-3333,台南南紡購物中心,3000");
}
這是某一個商家在各地分店準備要和收單銀行請款的檔案範例,主要欄位有3個,信用卡卡號、分店名稱和消費金額:
如果檔案在中間過程中被竄改,像是增加了一筆請款資料
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\temp\transaction.txt", true))
{
file.WriteLine("5567-1111-2222-3333,我是竄改的,1000");
}
多了第4筆資料
雖然多了1筆資料,但因為沒有檢核筆數機制,於是收單銀行就很有可能自動轉帳給商家$7,000元。
也許我們也常在檔尾(檔案的最後1筆)加上筆數來驗證
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\temp\transaction.txt", false))
{
file.WriteLine("4567-1111-2222-3333,高雄台鋁生活商場,1000");
file.WriteLine("4567-1111-2222-3333,台北微風信義分店,2000");
file.WriteLine("5567-1111-2222-3333,台南南紡購物中心,3000");
file.WriteLine("END,3");
}
檔案顯示筆數為3筆
解決了被附加資料的問題,但思考一下,如果檔案在中間過程中被竄改重新製作了一個新的檔案,像是改了第3筆的請款金額從$3,000改成$4,000。
因為沒有檢核金額的機制,於是收單銀行還是很有可能自動轉帳給商家$7,000元。
也許我們也在檔尾(檔案的最後1筆)除了筆數再加上消費總金額的加總來驗證
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\temp\transaction.txt", false))
{
file.WriteLine("4567-1111-2222-3333,高雄台鋁生活商場,1000");
file.WriteLine("4567-1111-2222-3333,台北微風信義分店,2000");
file.WriteLine("5567-1111-2222-3333,台南南紡購物中心,3000");
file.WriteLine("END,3,6000");
}
我們通常會加總某一個欄位的數值為check sum校驗值,當對方收到檔案時,可以使用校驗值來確認檔案室否完整,
但好像人工也很容易肉眼下去竄改。
也許我們來使用雜湊函數(Hash Algorithm)來增加每一筆資料的完整性,這邊我們使用SHA-2 Family SHA512 Class作雜湊。
SHA(Secure Hash Algorithm)
SHA256 shaM = new SHA256Managed();
List<string> datas = new List<string>()
{
"4567-1111-2222-3333,高雄台鋁生活商場,1000",
"4567-1111-2222-3333,台北微風信義分店,2000",
"5567-1111-2222-3333,台南南紡購物中心,3000",
"END,3,6000"
};
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\temp\transaction.txt", false))
{
foreach (var data in datas)
{
byte[] bdata = Encoding.Default.GetBytes(data);
string hash = BitConverter.ToString(shaM.ComputeHash(bdata)).Replace("-", "");
file.WriteLine($"{data},{hash}");
}
}
這樣每一筆的最後一個欄位就可以用來識別每一列的處理是否有遭到竄改。
接下來,收到檔案的收單行系統就可以檢查雜湊值(hash value)來確保資料完整未被竄改。
但也許我們會想到,因為這些雜湊演算法都是國際公開的學科,如果把每一種雜湊演算法都下去運算,還是可能會破解而竄改,應該還要更強化一點機密性。
我們明天繼續複習銀行業訊息鑑別的**MAC(Message Authentication Codes)**值。
米蘭警車
2011.10攝於Milano,Italy