通用方案
目的:
使數據安全保密傳輸,例如防止明文數據傳輸時,被黑客截獲,所帶來的安全隱患。
適應領域:
適合各種網路協定數據傳輸加密(如身份認證,交易接口,數據加密等)各種網路協定(如http, ftp, smtp等)。尤其適合使用在網際網路 用戶登錄認證, 交易接口。
現階段常用的方案:
使用ssh加密
建立傳輸隧道
1.使用ssh加密
2.建立傳輸隧道
優點:
實現簡潔,基於當前傳輸協定,數據安全傳輸。不增加任何連線埠,所以也不要修改當前的防火牆規則。
缺點:
增加網路傳輸量,系統客戶端和服務端的開銷,但很幸運的是開銷很小,也是任何一種安全措施不可避免的問題。
身份認證實現機制
1. 客戶端請求動態密鑰(DynamicKey ), 客戶端向伺服器端請求 動態密鑰( DKey )。伺服器端生成動態密鑰傳送給客戶端。動態密鑰內容格式根據需要自己設計,例如雙方支持的加密算法(MD5)、 隨機碼和密鑰有效期等,並且 在伺服器保存該動態密鑰, 保持形式可以是Session(推薦)、資料庫或檔案等,例如動態密鑰格式為(MD5 + 123456 + 2010/9/23/12:00:00),最簡單的形式只有一個 隨機碼。
2. 客戶端提交數據, 客戶端獲得動態密鑰後,用 動態密鑰中的加密算法 加密需要傳送到伺服器的數據(如:帳號和密碼)和 隨機碼, 客戶端把加密好的數據傳送給伺服器 :
3. 伺服器驗證應答, 伺服器把收到的 加密好的客戶端數據, 和伺服器端用動態密鑰中的加密算法對伺服器端數據(如保證在資料庫的密碼)和隨機碼進行加密,生成 加密好的伺服器端數據(Server encrypted data )進行比較,相等則認證成功, 伺服器刪除動態密鑰(DKey )。一個完整的數據安全傳輸結束。
套用實例
例如WEB用戶登錄認證步驟:客戶端瀏覽器用ajax向伺服器端WEB Server發生請求 動態密鑰( DKey ), WEB Server 生成DKey(隨機碼)傳送給客戶端,客戶端用特殊的加密方法加密輸入的用戶名和隨機碼得到加密信息Client_enc_name,用MD5加密輸入的用戶密碼和隨機碼得到加密信息Client_enc_pwd,然後提交給伺服器驗證。 伺服器用特殊的解密方法解密出用戶名input_name與資料庫中的用戶名db_name比較;用MD5加密數碼資料庫中的用戶密碼db_password得到加密信息Server_enc_pwd 與客戶端提交的得到加密信息Client_enc_pwd比較,比較相等則登錄成功,同時刪除 動態密鑰( DKey )。
註:這裡用戶名也可以不加密直接明文傳輸,但最好在客戶端用特殊的加密方法加密,在伺服器端用特殊的解密方法解密; 而用戶密碼一定要加密而且最好用MD5之類不可逆轉加密方法。
偽代碼:
Client: Request Dynamic_key
Server: Reply and Save Dynamic_key (random_num )
Client :
Client_enc_name = myencode (input_name + random_num)
Client_enc_pwd = md5 (input_password + random_num)
Server:
Input_name = mydecode (Client_enc_name + random_num)
Server_enc_pwd = md5 (db_password + random_num)
If (Input_name == db_name and Client_enc_pwd== Server_enc_pwd)
Returntrue
Else
Returnfalse
EndIf
Delete Dynamic_key
註: 每種方法都有各自的優缺點,有興趣可以參考其他方式,例如Kerberos, X.509. 本人從事多年WEB開發、Unix/Linux系統開發及用戶身份認證,希望能和大家交流探討。