DiffieHellman協(xié)議實(shí)踐

          開發(fā)過(guò)程中遇到了一些數(shù)據(jù)傳輸安全性問(wèn)題,一個(gè)很重要實(shí)際需求,客戶端加密的數(shù)據(jù)在服務(wù)端要解密回來(lái)還要進(jìn)行一些處理。

          腦中立馬跳出幾種解決方法:

          1、直接使用MD5進(jìn)行加密好了,可是MD5是不可逆的算法,而某些數(shù)據(jù)到達(dá)服務(wù)器端需要解密出來(lái)進(jìn)行一些處理??磥?lái)不滿足實(shí)際需求。

          2、那可以嘗試下DES,3DES或者AES等一些對(duì)稱算法加密處理,想想挺好的,對(duì)稱算法的效率也挺快。可是密鑰該怎么從服務(wù)端安全的傳遞到客戶端呢,這個(gè)問(wèn)題不解決,加密還是如同虛設(shè)。

          3、最后一種方案那就是使用RSA非對(duì)稱算法,這個(gè)算法的好處就是服務(wù)器端自己維護(hù)私鑰,把公鑰開放給客戶端,有人在網(wǎng)絡(luò)上監(jiān)聽到公鑰和加密后的數(shù) 據(jù)也沒(méi)關(guān)系,因?yàn)榧用艿臄?shù)據(jù)需要私鑰才能解的開。也許大家都熟悉https協(xié)議,其實(shí)這種協(xié)議就是用RSA非對(duì)稱算法來(lái)實(shí)現(xiàn),但是大家肯定也有感受,用 https的時(shí)候網(wǎng)頁(yè)打開的速度會(huì)比http要慢很多。我也考慮到這點(diǎn),于是做了一個(gè)基準(zhǔn)測(cè)試,在服務(wù)端寫了個(gè)測(cè)試類,結(jié)果讓我大吃一驚,2g的cpu循 環(huán)100次用私鑰去解密竟然花了我50000多毫秒,那我循環(huán)10000次呢,靠,竟然花了幾分鐘。那如果采用這種方案去實(shí)現(xiàn)的話,應(yīng)用程序的性能會(huì)被這 些解密動(dòng)作所拉下。沒(méi)辦法哦,又只能放棄此類方案。

          4、山重水復(fù)疑無(wú)路,柳暗花明又一村。突然腦中又蹦出另外一種想法,還是使用對(duì)稱算法,關(guān)于密鑰的傳遞可以采用DiffieHellman協(xié)議。 于是乎,上網(wǎng)查了一些資料,發(fā)現(xiàn)java類似的算法還是可以查的到,但是單有java也不行,我要在客戶端加密,java端進(jìn)行解密,所以還需要有 JavaScript的類似算法。最后在enano-1.1.7這個(gè)php開源的電子商務(wù)網(wǎng)站內(nèi)找到了相關(guān)信息。無(wú)意間發(fā)現(xiàn)這個(gè)開源程序的一篇wiki, 詳細(xì)介紹了一套安全解決方案(http://enanocms.org/News:Article/2008/02/20/Diffie_Hellman_key_exchange_implemented)。

          以上只是我的思路,但還沒(méi)有寫個(gè)應(yīng)用程序測(cè)試過(guò)。那么光有理論沒(méi)有實(shí)踐也不行,那就建個(gè)工程實(shí)現(xiàn)一下唄。嘿嘿。

          case:用戶注冊(cè)。

          case描述:客戶在客戶端填寫一些信息,提交之前通過(guò)密鑰把用戶名和密碼進(jìn)行加密,服務(wù)端需要把用戶名和密碼解密回來(lái)進(jìn)行進(jìn)行處理,一個(gè)很重要的 處理就是,給密碼加鹽值,然后進(jìn)行MD5加密,也許你會(huì)問(wèn),為什么這個(gè)動(dòng)作不能在客戶端做呢,其實(shí)也是可以的,但是為了不想讓黑客知道我密碼加密的體制所 以放到服務(wù)端進(jìn)行。

          case UML:


          設(shè)計(jì)到的一些類和文件:




          其中用到了base64,主要就是解決了中文亂碼問(wèn)題。

          實(shí)現(xiàn)過(guò)程中的一些總結(jié):

          1、對(duì)于安全算法等一些總結(jié),我用到一些相關(guān)算法類都是可以單獨(dú)拿來(lái)用的。而jdk中也有支持的相關(guān)類,可以看看jca和jce。這兩個(gè)擴(kuò)展包其實(shí)并沒(méi)有真正的實(shí)現(xiàn),他們只是對(duì)這些安全問(wèn)題的抽象。真正的實(shí)現(xiàn)有sunjce和Bouncy Castle。

          2、對(duì)于算法本身定義的理解很重要,AES支持128,192,256位的密鑰,但每次被加密的一定要是128位的內(nèi)容,一般我們被加密的都是超過(guò)此長(zhǎng)度的,那可以這么來(lái)處理:


          把要加密的內(nèi)容進(jìn)行分組處理。解密也是類似。

          最后的總結(jié):此次實(shí)踐只是模擬了一個(gè)場(chǎng)景,還可以運(yùn)用很多場(chǎng)景中,OpenSSL,OpenID都可以運(yùn)用。不是我說(shuō)的,我也是看了找了相關(guān)的材 料,OpenSSL java的項(xiàng)目還在建設(shè)中,php是有的,大家可以去找下,openid也是有用到的,這里推薦一個(gè)開源的項(xiàng)目openid4java,也可以去查查看, 有時(shí)間去看看里面的源碼還是不錯(cuò)的。如果你也啥地方還不明白或者需要里面用到的一些代碼,可以和我溝通交 流,msn:yangpingyu@gmail.com.

          posted on 2011-02-21 16:00 yangpingyu 閱讀(506) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2011年2月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272812345
          6789101112

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          收藏夾

          linux

          產(chǎn)品交互

          分析,設(shè)計(jì),架構(gòu)

          安全

          技術(shù)牛人

          數(shù)據(jù)庫(kù)

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 库车县| 治县。| 乌什县| 若尔盖县| 洪湖市| 南阳市| 三原县| 临清市| 平凉市| 通许县| 来宾市| 桓仁| 广宗县| 化德县| 山西省| 宜兴市| 桐城市| 浏阳市| 蓬莱市| 松原市| 通辽市| 佛教| 阆中市| 察隅县| 余干县| 峨山| 横山县| 南澳县| 松江区| 岑巩县| 金湖县| 夹江县| 高密市| 八宿县| 石城县| 沙坪坝区| 宝山区| 界首市| 金阳县| 蓝田县| 曲周县|