Delphi編寫網路程式的安全措施
Delphi的MIDAS控制為編寫網路程式提供了十分方便的手段。利用這些控件,可以編寫區域網路上的客戶機/伺服器體系程序,也能方便地在Internet上創建分散處理的應用。
網路程序的一個重要問題是安全性考量。一些敏感資料在網路上傳送,很有可能被人非法攔截以造成不必要的損失。在實際的程式設計過程中,我採取了一些有效的防範措施,在此作些簡單的介紹。
一、 原理
目前進行資料加密的方法很多,對資料的保護起到一定的作用。但若採用固定的密鑰或是密鑰隨資料一起傳送,則均無法達到令人滿意的保密效果。在實踐過程中,我摸索出了一套「請求-應答」模式的隨機密鑰方法,對密碼和資料的保密效果都令人十分滿意。
當用戶端程式啟動並企圖與伺服器程式建立連線時,用戶程式會從伺服器端取得一個由伺服器程式產生的隨機字串,系統將以此字串為金鑰來傳送使用者登入密碼和資料。由於金鑰由伺服器程式隨機產生,客戶每次登入時金鑰均不相同,因此大大減少了密碼被攔截導致資料被竊的可能性。
伺服器端可以在遠端資料模組中引出一個自訂接口,該接口返回一個隨機字符串。遠端資料模組要記錄該字符串作為後續處理的密鑰。隨機字串的產生法可以多種多樣,最簡單的方法是用Random()函數產生一個隨機數後再由此數用Format()函數或IntToStr()產生一個字串。
二、 用戶登入措施
為了防止程式被非法調試而洩露密碼,必須將客戶的登入資訊在伺服器端處理,也可以專門增加一個安全層負責客戶的登入。客戶的登入資訊儲存在客戶資料表中,包括使用者名稱、密碼、權限等資訊。
客戶程式登入時,先呼叫伺服器程式的介面取得金鑰字符串,並用此金鑰對使用者輸入的使用者名稱和密碼進行加密並向伺服器傳送登入資訊。加密演算法可以是DES演算法或其它有效演算法。伺服器接到登入資訊後,先用先前產生並記錄的隨機密鑰對登入資訊進行解密,再將解密後的資訊與儲存的客戶資料表中的資訊進行對照,從而判斷客戶資訊是否合法以及該客戶享有的數據權限等。
該過程的客戶端程式如下:
strKey:=myRemoteSever.GetKey();
{呼叫伺服器的介面取得隨機金鑰}
UserName:=Ency(strUserName
strKey);
{對使用者名稱加密,Ency()為加密演算法}
PassWord:=Ency(strPassword
strKey);
{對登入密碼進行加密}
If myRemoteServer.LogIn(UserName
Password) then {登入}
Begin
{進行處理}
End;
伺服器端的登入程序LogIn()如下:
strUserName:=DeEncy(UserName
strKey);
{對使用者名稱解密,DeEncy()為解密演算法}
strPassword:=DeEncy(Password
strKey);
{對登入密碼解密}
{查詢資料庫}
if (Pass) then
Result:=true
Else
Result:=false;
要注意的是,在伺服器程式和客戶程式中,StrKey均應定義為全程變數。
為了防止客戶資料表被程式外開啟而洩露密碼,可以對客戶資料進行一定的加密措施,例如PARADOX表可以新增Password,伺服器程式在存取客戶資料表時先提供該Password。
三、 資料傳送
在網路程式中,某些敏感資料在網路上傳送時必須加密。 Delphi的MIDAS機制提供了資料加密的途徑,可以在資料傳往客戶端之前對一些欄位進行加密,也可以在接收到客戶端的更新資料請求後對來自客戶端的資料的對應欄位進行解密後才向資料庫進行更新。為了達到些目的,可以在伺服器程式的遠端資料模組中加入一個TPRovider或是TdataSetProvider對象,並將此對象的DataSet屬性置為要處理的資料集。在Tprovider的OnGetData事件中加入以下程式碼:
with DataSet do
begin
while not EOF do
begin
Edit;
SensitiveData.AsString :=
Ency(SensitiveData.AsString
strKey);
{對敏感資料加密}
Post;
Next;
end;
end;
以上代碼可以將敏感資料加密後再送到客戶程式。
同樣,在Tprovider的OnUpdateData事件中加入一些處理程式碼便可對客戶端送來的資料進行解密。
以上只是介紹了網路程式安全措施實現的一般原理,在此基礎上,可以增加其它保密措施,以達到更好的保密效果。例如,客戶程式可以使用特定的輔助硬體設備來增加安全性。在智慧卡應用程式中,客戶程式在登入時不僅要求使用者輸入使用者名稱和密碼,程式同時檢查IC讀寫器中IC卡的類型及特定的內容,這樣,既使密碼洩露了不會被人冒名登入。當然,任何安全措施都不是絕對安全的,安全措施還要有嚴格的保密製度及使用人員的高度的保密意識才能真正起到保密作用。