摘要:這種神奇的算法可以讓你服務(wù)器和客戶端在不傳輸該對(duì)稱密鑰的情況下就可以通過(guò)心有靈犀地方式各自計(jì)算出一個(gè)對(duì)稱密鑰,而且可以一樣,避免了該密鑰在網(wǎng)絡(luò)上流通,而且你可以隨意更換,過(guò)期時(shí)間定為分鐘,可謂是狠毒至極我們引入就是為了解決上面的問(wèn)題。
首先是前段時(shí)間我在公眾號(hào)里被人批(dui)評(píng)(gang)了,大概意思就是:你別老整那ECDH又是橢圓又是素?cái)?shù)啥的,你就說(shuō)這玩意實(shí)際項(xiàng)目中怎么用就完了,我們不想聽(tīng)那些,那些我們都懂都精通,而且你還太監(jiān)了,你自己看看是不是太監(jiān)了,ECDH寫(xiě)到上一篇明顯還沒(méi)完,結(jié)果到現(xiàn)在了還沒(méi)下文,你自己說(shuō)是不是太監(jiān)了,你自己說(shuō)。
其次是實(shí)際上本篇內(nèi)容實(shí)際上和ECDH沒(méi)有半毛錢(qián)關(guān)系,通篇都是DH(少了EC兩個(gè)字母),不過(guò)在項(xiàng)目中實(shí)際應(yīng)用的業(yè)務(wù)邏輯寫(xiě)法、道理都是一樣曬兒的。你現(xiàn)在可以暫時(shí)認(rèn)為DH就是ECDH的“ 少了兩個(gè)字母版本 ”。用DH的最主要原因是啥呢,因?yàn)闀r(shí)間有限,我優(yōu)先寫(xiě)了DH的常用語(yǔ)言庫(kù)文件,目前可用,ECDH的一根毛都沒(méi)有寫(xiě),所以只能用DH演示。
最后是再次強(qiáng)調(diào)一遍,作為一篇正經(jīng)的文章,我需要再次科普一下DH是啥意思。
很多都以為DH是Daemon Hunter(惡魔獵手)的簡(jiǎn)稱,然而并不是。Daemon Hunter是真實(shí)名稱叫做伊利丹,是個(gè)瞎子同時(shí)又是法瑪麗奧(就是老鹿)的兄dei。他暗戀白虎(就是那種真的白虎)泰蘭德,然而泰蘭德卻嫁給了老鹿,事情大概就是這么一回事。在我們這里DH則是Diffie-Hellman的簡(jiǎn)稱,二位大爺?shù)恼掌乙郧百N過(guò),現(xiàn)在不得不再貼一遍:
上圖告訴我們頭發(fā)長(zhǎng)短與職業(yè)無(wú)關(guān),douyin上那些自以為get到程序員梗的短視頻真的是LOWB到一塌糊涂。
在正式開(kāi)始前之前,我還是要說(shuō)明一下用DH的初衷是什么或者說(shuō)這個(gè)東西是來(lái)解決什么問(wèn)題的。接著上篇的故事(點(diǎn)擊這里)說(shuō):
你老板說(shuō)項(xiàng)目非常牛逼,數(shù)據(jù)要加密,用牛逼的加密算法
你就用RSA非對(duì)稱加密開(kāi)發(fā)測(cè)試操作猛如虎
然后,一上線:CPU炸了,成績(jī)1-5
然后你找老板審批升級(jí)服務(wù)器費(fèi)用,老板給了你300塊并讓你放心花大膽花
你首先把RSA下線了,然后偷偷換成了AES對(duì)稱加密,CPU不炸了
然后三百塊偷偷放到了自己腰包里
但是AES的對(duì)稱密鑰你寫(xiě)死到客戶端,被逆向就完了;如果通過(guò)服務(wù)器下發(fā),聽(tīng)起來(lái)更加扯淡
想了想,你拿著三百塊錢(qián)組了個(gè)局兒,你帶著錢(qián),我?guī)е愋?,老趙帶著柱子,再加上大彪,正好六人局
局上我向你透露出一種方案:將AES對(duì)稱密鑰通過(guò)非對(duì)稱方式協(xié)商出來(lái)。DH這種神奇的算法可以讓你服務(wù)器和客戶端在不傳輸該對(duì)稱密鑰的情況下就可以通過(guò)心有靈犀地方式各自計(jì)算出一個(gè)對(duì)稱密鑰,而且可以一樣,避免了該密鑰在網(wǎng)絡(luò)上流通,而且你可以隨意更換,過(guò)期時(shí)間定為1分鐘,可謂是狠毒至極!
我們引入DH就是為了解決上面的問(wèn)題。然而,DH或ECDH并不能解決中間人攻擊問(wèn)題,這個(gè)要搞明白了。
所以,在正式開(kāi)始之前,我必須先安利我和東北大嫖客還有巨蛀以及阿尼特寫(xiě)的DH庫(kù),github鏈接是這個(gè),下面我將利用這些DH庫(kù)們進(jìn)行demo演示。
https://github.com/ti-dh
(明眼人已經(jīng)看出來(lái)我是來(lái)騙star的)
目前這個(gè)庫(kù)提供了純PHP、C實(shí)現(xiàn)的PHP擴(kuò)展、Java版,列個(gè)表格吧:
先說(shuō)下服務(wù)端和客戶端進(jìn)行協(xié)商地整體流程,非常非常簡(jiǎn)單:
整個(gè)協(xié)商流程中,只有第二步和第三步會(huì)發(fā)生數(shù)據(jù)交互。第二步是API下發(fā)p、g、server-num給客戶端;第三步是客戶端向API提交client-num數(shù)據(jù);最后一步,對(duì)稱加解密用的key就已經(jīng)計(jì)算出來(lái)用于生產(chǎn)環(huán)境了。
下面我用世界上最好的語(yǔ)言演示一下如何使用這個(gè)鬼東西,客戶端我們用什么演示呢?客戶端也依然使用世界上最好的語(yǔ)言來(lái)演示。首先,你們把上面github里的庫(kù)文件集成到你們API里,我這里集成完畢后代碼如下:
API demo code:dh = new Dh(); } // 這就是上圖中的第二步:客戶端訪問(wèn)這個(gè)API獲取g p 和 server-num public function getdhbasedataAction() { $ret = $this->dh->getdhbasedata(); echo json_encode( $ret ); } // 這就是上圖中的第三步:客戶端通過(guò)這個(gè)api提交client-num參數(shù) public function postdhclientdataAction() { if ( $this->getRequest()->isPost() ) { if ( empty( $_POST["client_number"] ) || !is_numeric( $_POST["client_number"] ) ) { exit( json_encode( array( "code" => -1, "message" => "wrong parameters", ) ) ); } $ret = $this->dh->postdhclientdata( $_POST ); echo json_encode( array( "key" => $ret, ) ); } } }Client demo code:
get( "https://xxxx.ooo/dh/getdhbasedata" ); $ret = json_decode( $ret, true ); $p = $ret["p"]; $g = $ret["g"]; $server_number = $ret["server_number"]; // 2、第二步,根據(jù)服務(wù)器獲取到的數(shù)據(jù)計(jì)算出client-number $process_client_number = gmp_powm( $g, $client_number, $p ); // 3、第三步,將計(jì)算過(guò)后的client-number發(fā)送給服務(wù)器 // 那個(gè)demo里已經(jīng)有完美的演示了,多看代碼 $ret = $curl->post( "https://xxxx.ooo/dh/postdhclientdata", array( "client_number" => gmp_strval( $process_client_number ), ) ); $ret = json_decode( $ret, true ); // 4、第四步,根據(jù)server-number,client-number和p 計(jì)算出公共密鑰K $key = gmp_powm( $server_number, $client_number, $p ); echo PHP_EOL."DH非對(duì)稱密鑰產(chǎn)生交換:".PHP_EOL; echo "client計(jì)算出的public key : ".$key.PHP_EOL; echo "server計(jì)算出的public key : ".$ret["key"].PHP_EOL.PHP_EOL;
客戶端文件保存client.php,然后php client.php執(zhí)行一下,結(jié)果你們感受一下:
一樣有沒(méi)有?!計(jì)算出來(lái)的都一樣,有沒(méi)有??。?/p>
上圖中那么一坨長(zhǎng)的不能整的讓人看了就覺(jué)得惡心嘔吐的數(shù)字就是API和客戶端分別計(jì)算出來(lái)的對(duì)稱加解密的密鑰了,請(qǐng)注意實(shí)際使用過(guò)程中,服務(wù)器千萬(wàn)不要把這個(gè)數(shù)據(jù)返回給客戶端,demo里這么做就是為了演示而已,用的時(shí)候自己也需要?jiǎng)觿?dòng)腦子的。
然而,事情往往不會(huì)說(shuō)就是這么簡(jiǎn)單就可以了,如果在生產(chǎn)環(huán)境使用,還是需要繼續(xù)完善一些細(xì)節(jié)的。
第一個(gè)問(wèn)題就是有些想的比較多的寶貝兒們會(huì)不同的兩個(gè)客戶端計(jì)算出來(lái)的key會(huì)不會(huì)一樣?可能性非常非常非常小
第二個(gè)問(wèn)題就是一般客戶端登陸的用戶都有自己的token或uid之類(lèi)的,API這里在與一個(gè)客戶端協(xié)商出一個(gè)key后可以以 “ token:key ” 格式把key存儲(chǔ)到redis中,然后給一個(gè)有效時(shí)間比如30分鐘;客戶端也將key保存到手機(jī)內(nèi)存中設(shè)置一個(gè)30分鐘有效期。每次使用key進(jìn)行加解密前都驗(yàn)證一下是否過(guò)期,如果過(guò)期了就重新走一遍前面的協(xié)商流程
我發(fā)誓,這是關(guān)于DH或ECDH的最后一篇文章了,以后我再也不會(huì)寫(xiě)任何與這兩個(gè)英文縮寫(xiě)相關(guān)的東西了,我說(shuō)都是真的,我保證說(shuō)到做到。
歡迎來(lái)公眾號(hào)懟我、杠我:文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/31486.html
摘要:這種神奇的算法可以讓你服務(wù)器和客戶端在不傳輸該對(duì)稱密鑰的情況下就可以通過(guò)心有靈犀地方式各自計(jì)算出一個(gè)對(duì)稱密鑰,而且可以一樣,避免了該密鑰在網(wǎng)絡(luò)上流通,而且你可以隨意更換,過(guò)期時(shí)間定為分鐘,可謂是狠毒至極我們引入就是為了解決上面的問(wèn)題。 首先是前段時(shí)間我在公眾號(hào)里被人批(dui)評(píng)(gang)了,大概意思就是:你別老整那ECDH又是橢圓又是素?cái)?shù)啥的,你就說(shuō)這玩意實(shí)際項(xiàng)目中怎么用就完了,我...
摘要:很明顯,非對(duì)稱加密的極大的消耗成了一種瓶頸。其中,利用非對(duì)稱加密的方案大概就是我前面說(shuō)的那樣,偽代碼已經(jīng)展示過(guò)了。 其實(shí),前面兩篇翻來(lái)覆去只為叨逼叨叨逼叨兩件事情: 對(duì)稱加解密,典型算法有AES、DES、3DES等等 非對(duì)稱加解密,典型的算法有RSA、DSA、ECDH等等 但是,我知道大家最討厭在看這種文章的時(shí)候冒出來(lái)的一坨橢圓曲線、素?cái)?shù)、質(zhì)數(shù)等等這樣的玩意,反正看也看不懂,理解也...
摘要:由于密鑰被暴露了,所以必須換新的密鑰,元首這會(huì)兒只能走途徑告訴古德里安新的密鑰,這會(huì)兒逗逼的事情來(lái)了,如何對(duì)密鑰進(jìn)行加密。但是,有一點(diǎn)是值得說(shuō)明,那就是無(wú)論是對(duì)稱加密還是非對(duì)稱加密,都頂不住用機(jī)器是強(qiáng)行暴力猜解私鑰。 懶漢 入門(mén) 這兩點(diǎn)就足以說(shuō)明這篇文章不想要著有什么高端大氣的技術(shù)內(nèi)容,我跟你講,全是水。不可能有什么質(zhì)數(shù)素?cái)?shù)、橢圓曲線加密、迪菲-赫爾曼什么的,不可能有的。 首先我不...
摘要:實(shí)際上這一篇和上一篇均可以看作是關(guān)于加解密的懶漢入門(mén)篇安全加強(qiáng)篇一的后續(xù),只不過(guò)側(cè)重點(diǎn)在于安全上?;氐缴掀Y(jié)果提到的問(wèn)題,就是對(duì)稱加密的安全性要人命,非對(duì)稱加密的性能非常要人命。元首作為高智商罪犯,這種低級(jí)錯(cuò)誤是不可能犯的。 為什么標(biāo)題總是要帶上API安全關(guān)鍵字呢?因?yàn)槲蚁胛覙?lè)意。 實(shí)際上這一篇和上一篇均可以看作是《關(guān)于PHP加解密的懶漢入門(mén)篇(API安全加強(qiáng)篇一)》》)的后續(xù),只不過(guò)...
摘要:實(shí)際上這一篇和上一篇均可以看作是關(guān)于加解密的懶漢入門(mén)篇安全加強(qiáng)篇一的后續(xù),只不過(guò)側(cè)重點(diǎn)在于安全上?;氐缴掀Y(jié)果提到的問(wèn)題,就是對(duì)稱加密的安全性要人命,非對(duì)稱加密的性能非常要人命。元首作為高智商罪犯,這種低級(jí)錯(cuò)誤是不可能犯的。 為什么標(biāo)題總是要帶上API安全關(guān)鍵字呢?因?yàn)槲蚁胛覙?lè)意。 實(shí)際上這一篇和上一篇均可以看作是《關(guān)于PHP加解密的懶漢入門(mén)篇(API安全加強(qiáng)篇一)》》)的后續(xù),只不過(guò)...
閱讀 2014·2021-09-28 09:43
閱讀 1294·2021-09-23 11:22
閱讀 2965·2021-09-14 18:05
閱讀 1964·2019-08-30 15:52
閱讀 3002·2019-08-30 10:55
閱讀 2193·2019-08-29 16:58
閱讀 1582·2019-08-29 16:37
閱讀 3186·2019-08-29 16:25