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