tcp/ip網絡通訊安全是一個廣受關注的話題,現在也有一些基於tcp/ip加密技術標准如SSL,TLS等。但很多時候編寫一些簡單的網絡通訊把這標准加密應用添加進來乎一下子把程序變得復雜了,而實現自己的加密算法那就更加不可取;其實通過一些現有的加密的技術應用完全可以實現即簡單又安全的網絡通訊程序。首先保證網絡通訊安全有兩個方面,第一保證連接的有效性,其二就是保證內容即使被人攔截也難以從內容得到相關信息。
連接有效性
平常寫網絡程序在允許一個連接接入操作的時候,我們一般要對它進行一個有效性驗證,如提供用戶名密碼或簽名。
簽名:
通過用戶提供一分數據和數據相關簽名信息,對方進行一個有效性驗證。那這個數據和簽名數據怎么做呢,其實現有加密技術中已經有一種描述提供了這種解決方案那就是RSA(非對稱加密)。可以通過 RSA 的持有privatekey和publickey方進行一個數據簽名,對方通過publickey進行一個驗證.如果publickey和privatekey是配對的情況,那持有publickey就能驗證成功,否則就會驗證失敗。在連接進行操作前可以通過這種方式進行處理,簽名有效允許連接操作,無效的話可以直接把連接關閉。
下面介紹通過c#如何實現這種簽名:
RasCrypto pri = new RasCrypto(); RasCrypto pub = new RasCrypto(); pub.PublicKey = pri.PublicKey; string name = "henry"; string singdata = pri.Sign(name); Console.WriteLine(pub.Verify(name, singdata));
RasCrypto是通過封裝的類,源代碼可以通過https://smarkdata.svn.codeplex.com/svn/Smark/Smark.Core/Smark.Core/RasCrypto.cs獲取;在實際使用中最好是根據不同簽名有不同的密對,這樣即使某簽名的密對被盜也不會影響其他用戶的安全。
用戶名密碼:
基於用戶名和密碼驗證是一種很常見的方式,但有個問題就是如何保證用戶名和密碼在通訊過程即使被截取了也難以得到用戶名和密碼呢?其實通過 RSA 也能夠很好地解決這一問題。 RSA 提供public key加密而private key解密的方式,可以把public key提供給請求方就行了,private key保存在服務端;這樣就可以保證加密的東西只有服務端才有解密,即使加密信息被其他人攔截也難以獲取原有信息。
下面介紹通過c#使用ras進行加解密
RasCrypto server = new RasCrypto(); RasCrypto client = new RasCrypto(); client.PublicKey = server.PublicKey; string name = "henry"; string pwd = "123456"; string ename = client.Encrypt(name); string epwd = client.Encrypt(pwd); string dname = server.Decrypt(ename); string dpwd = server.Decrypt(epwd); Console.WriteLine("name:{0}", name); Console.WriteLine("pwd:{0}", pwd); Console.WriteLine("-----------------------------------------------------------"); Console.WriteLine("ename:{0}", ename); Console.WriteLine("epwd:{0}", epwd); Console.WriteLine("-----------------------------------------------------------"); Console.WriteLine("dname:{0}", dname); Console.WriteLine("dpwd:{0}", dpwd); Console.WriteLine("-----------------------------------------------------------");
為了應用更安全,針對不同的連接生成不同的RSA密對,這樣就能保證每個連接的各自安全性.
信息加密
前面提到的 RSA 可以進行數據加解密,其安全性也非常可靠;但有個缺點就是RSA對數據比多的時候加密比較慢,有些 RSA 加密的實現還有數據長度的限制。所以在很多情況下就要選擇別的加密方式,這里介紹DES(對稱加密)。不過對稱加密有個缺點就是密對雙方都必須一樣,這樣就會導致一個問題就從某一方獲取密對就能對數據加密和解密工作。所以對稱加的密對保護就顯示非常重要的,這個工作可以交給 RSA 來做。
以下是c#運用 RSA +DES的加解密方法
RasCrypto server = new RasCrypto(); RasCrypto client = new RasCrypto(); client.PublicKey = server.PublicKey; DESCrypto serverdes = new DESCrypto(); DESCrypto clientdes = new DESCrypto(); //獲取沒加密的key,iv DESCrypto.DESInfo info = clientdes.KeyInfo; Console.WriteLine("KEY: "+Smark.Core.Functions.ToString(info.Key)); Console.WriteLine("IV: "+Smark.Core.Functions.ToString(info.IV)); Console.WriteLine(""); //設置相應的RSA信息 serverdes.PrivateRas = server; clientdes.PublicRas = client; //獲取了設置RSA信息的key,iv info = clientdes.KeyInfo; Console.WriteLine("KEY: " + Smark.Core.Functions.ToString(info.Key)); Console.WriteLine("IV: " + Smark.Core.Functions.ToString(info.IV)); //數據加密 serverdes.KeyInfo = info; string value = "henryfan@msn.com", evalue = null, dvalue = null; evalue = serverdes.Encrypt(value); dvalue = clientdes.Decrypt(evalue); Console.WriteLine("VALUE: " + value); Console.WriteLine("EVALUE: " + evalue); Console.WriteLine("DVALUE: " + dvalue); Console.WriteLine(""); evalue = clientdes.Encrypt(value); dvalue = serverdes.Decrypt(evalue); Console.WriteLine("VALUE: " + value); Console.WriteLine("EVALUE: " + evalue); Console.WriteLine("DVALUE: " + dvalue); Console.WriteLine(""); Console.Read();
通過RSA和DES就能夠簡單地實現可靠的網絡通訊安全,不過有些朋友喜歡構建自己的加密方法,在這里並不見意這樣做;因為自己構建的加密方法的可靠性並沒有得到驗證,並不像現有的加密方法經過長時候實踐和大量的應用總結出來。
相關資料:
DES http://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%99%E6%BA%96
RSA http://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95