導航:首頁 > 源碼編譯 > 阮一峰演算法

阮一峰演算法

發布時間:2025-06-30 20:51:37

❶ 矩陣的乘法運算怎麼算

矩陣的乘法,首先要判定能不能作乘法,即要求作乘法時,前一個矩陣的列數與後一個矩陣的行數相等。

設矩陣A是m×n的、矩陣B是n×s的,乘法AB後得到矩陣C,則C為m×s的,如下圖所示。

其他元素也是同理,分別取A的某行與B的某列,將對應元素相乘求出。

❷ 如何評價阮一峰老師《未來世界的倖存者》這本書

新聞說,今年全國高校畢業生達到空前的756萬,又趕上很多傳統行業壓縮產能,就業壓力很大。
很多曾經的「明星專業」,都已經就業困難。我考大學的時候,國際貿易是最熱門的專業之一,大家認定這個專業容易賺錢。但是現在這個專業的畢業生,想找一份好工作會很難,上海將它列入10大預警專業,即最難就業的十個專業之一。
但是,並非所有行業都不景氣。至少有一個行業的用工需求極其旺盛,到處都是招聘廣告,工作崗位是應聘者數量的好幾倍,通常你都有好幾家公司可以挑。每周都有朋友發來消息,能不能幫忙介紹幾個人過來,我們實在是缺人啊。
這個行業就叫做互聯網開發。
二、
互聯網行業的勞動力需求,可以用「用工荒」來形容。
只要你會做網頁,尤其是手機App的頁面,或者微信的活動頁面,就不愁找不到工作。哪怕你剛剛學會幾個月,或者剛從培訓班畢業,只要能拿出作品,就會有比其他行業高得多的起薪。等到有了一兩年工作經驗,工資就可以達到大學教授的水平。
這樣的就業行情,怎不令人趨之若騖。盡管每年都有好幾萬新人加入,互聯網公司還是在喊,工程師嚴重短缺。
我曾經不太理解,為什麼網頁開發工程師(或稱"前端工程師")這么搶手。直到有一天,看到了一組雞蛋的統計數據,才想通了這個問題。
三、
中國是世界雞蛋第一大國。據統計,2013年全國產量5750億枚,一個中國人平均一年要吃掉400多枚雞蛋。
那麼中國需要多少只母雞,才能達到這樣的產量?
據說,普通母雞一年大概生200~250枚雞蛋。養雞場裡面最優秀的母雞,一年可以達到320枚。以250枚計算的話,中國至少需要有23億只母雞,才能滿足全國人民吃蛋的需求。
四、
如果把雞蛋換成網頁,同樣的問題就是,中國一年需要生產多少張網頁,才能滿足人民消費的需要?
去年,我國手機用戶超過13億,智能手機用戶超過6億。就算其中只有一半人上網,那也是3億多人。這么多人,每天都有幾十分鍾或者幾個小時,要使用手機上網。全體中國人一年消費的網頁和App的數量,是一個天文數字。
雞蛋是母雞生出來的,網頁從哪裡來?歸根結底,所有頁面都需要工程師做出來。那麼多互聯網公司,每家公司都需要前端工程師。而全國的前端工程師,目前可能總共有幾十萬人,對比那麼大的內容消費量,肯定是遠遠不夠的(想一想吧,全國的母雞有23億只)。這樣一想,工程師搶手就不奇怪了。
還有一個很重要的原因,學校不教前端開發,可能會有一些相關課程,但不會系統地教,所有前端工程師都是靠自學的。這也導致了供給偏少。
五、
由於工作好找和工資較高,前端工程師現在成了一個熱門職業。很多不是搞計算機的人,也在考慮轉行加入。社會上的培訓班,每個周末的各種講座和大會,都已經人滿為患。
我經常收到電子郵件,咨詢是否應該改行。
「我是一名會計/教師/導游,現在的工作沒有任何成就感,感到沒有發展空間。如果我拿出一年左右的時間去自學前端類的課程,將來能走上程序員這條路嗎?」
這可怎麼答復?
六、
前端編程入門,確實不難,可以短期速成。只要你對計算機有基本的理解,哪怕編程零基礎,經過三四個月的培訓,也能做出網頁和App。 如果你確實想改行,我覺得,這基本上是一件好事,你應該選擇那些更有前景的職業。但問題是,並非每個人都適合編程。現在那麼多人一窩蜂學習互聯網開發,肯定有人將來會後悔。
你最好事先知道下面三件事,再考慮加入這個行業。
七、
首先,你應該熱愛編程。
職業程序員每天都必須長時間地坐在電腦前面,與機器對話的時間,遠超過與人對話。如果不是真心熱愛編程,這會很難忍受,簡直像是一種懲罰。讓一個人在他不喜歡的事情上面,筋疲力盡地幹上幾年甚至幾十年,那是多麼痛苦的人生。
其次,編程本身雖然是一種智力活動,但是中國的現實卻更像一種體力勞動。
由於運營活動太多,開發是做不完的,App 必須不斷地推出新版本。工作量常常是超負荷的,任務排期一個接著一個,中間根本沒有喘息時間,同時做多個項目也是家常便飯。每個項目都有截止期,做不完只能加班。這樣說吧,製作網頁本身是有趣的,但是像流水線一樣的「製造」網頁是乏味的,好比養雞場的母雞不停得下蛋,每周必須完成5個蛋的指標。
最後,這個行業的新陳代謝很快。
快速的技術更新和極大的工作強度,使得年輕人具有天然的優勢。等到職業生涯後期,你的開發速度開始慢下來,就是你被更年輕的人取代的時候。一隻母雞一生中,大約總共可以生2000枚雞蛋,你的一生中可以製作的網頁(或者 App),大概也是一個常數。
八、
如果你不喜歡編程,體會不到代碼的樂趣和成就感,只是為了一份好的薪水,就跑來干,那就是很糟糕的選擇。想一想如果十年前,你聽說國際貿易很興旺,高考志願就填了國際貿易,今天會怎樣呢?
你應該選擇,那些讓你產生最大興趣和熱情的職業。因為未來所有行業,低端的、低技能的崗位都會被機器取代,只有技能最強、最有創造性的人不會被淘汰。興趣,也只有興趣,才會讓你產生不倦的熱情,鑽研下去,變得更優秀。

用戶提供的回答2:
把網頁比作雞蛋是偷換概念,一個雞蛋只能被吃一次,但網頁可以被無限次瀏覽
正確的比喻應該是永遠在變的需求
不過我同意絕大部分的前端工作門檻都非常低,我就是中文系畢業的前端碼農
用戶提供的回答3:
未來的世界
作為一個無所事事的大學生,其實自己的腦子里偶爾會冒出許多的問題,看到阮老師寫的文章,自己也有很多的感觸,斗膽說出來交流一下。
關於機器與工作
阮老師上來就問了一個哲學上的終極問題-------"世界會走向哪裡「,這確實是個難以回答的問題,阮老師提出了機器替代人。現在九歌已舉出很多的職業將會會被人工智慧和機器替代的實例。那我這里就發一個最近看到的。微軟發布萬能翻譯器 可以充當60個國家的翻譯官 考慮到MSRA曾經有沈向洋,輪子哥,叛逆者這樣的大神。未來把翻譯這個職業幹掉也不是什麼問題。所以如阮老師所說,越來越多的職業,尤其是白領職業會被機器所替代掉,越來越多的人變得」無用「。正式由於機器的發展使得他們的勞動和機器生產比起來低效。而且在自動化的浪潮中,最重要的就是減少工作崗位,隨著技術水平的提升,想想程序員們996就抱怨的不行,一個不受勞動法保護,一周24小時無休,不用付工資和社保,絕對服從,毫無怨言的機器在老闆的眼裡應該是一個完美的員工吧。
在管理上,理想上公司是不應該依靠員工的,更加流程化,規范化的管理和流程就能降低對於人才的依賴,然而悲慘的是人才只有具有不可替代性才能在人才市場上獲得高價,最好公司離開了自己就會倒閉,這樣才能有底氣和老闆談工資。於此同時,大公司也在極力避免這件事的發生。但現在,越來越科學的管理體制,更加強大的機器,使得優勢越來越像資方傾斜也是不爭的實施。而且就工資來說也是殘酷的,今天老闆為工程師付工資並不是因為工程師是人,而是因為他能解決相關方向的問題。是結果導向的,是為你的工作成果付錢,只要合理合法,老闆也是不在乎過程的。如果有一天機器能夠產出相同甚至是更好的成果,那麼我們就失業了。
就拿打車來講,你在乎的是如何更快更好的從家到飛機場,而不在乎具體到底是那個司機送你。所以無人駕駛的發展,確實會讓司機失業。作者用騾子來舉例,我認為是非常恰當的。「......(你)只是一個負責實現領導意志的技術工人,職責就是根據規格說明書寫出代碼,其實與一個挖水溝的工人是一樣的,從這頭挖到那頭,僅此而已,從事的都是機械性的工作。」我承認碼農是這樣的,那難道設計師,產品經理,甚至各種總監,職業經理人,乃至CEO不是這樣的么?沒有人能夠在這次變革中倖免,昨天幹掉了初級碼農,今天就將中高級碼農掃入垃圾堆,明天把各種總監,架構師踹下去,到最後連CEO都會滾蛋。
那有沒有不能被機器人替代的工作呢?作者這里引述了吳曉波的觀點,我們一個一個看。
「(1)個性化服務能力。軟體都是統一的演算法,個性化服務很難做到」
評述:我覺得機器可以做到這一點,雖然演算法是統一的並不代表不能做個性化服務,淘寶不是一直在做一些「猜你喜歡」這樣的商品推薦么,本質上是對於用戶的各種數據和行為進行建模,然後通過一套推薦演算法來進行個性化服務。我沒做過這個方向,歡迎做機器學習和推薦演算法的大牛來進行解答。我覺得個性化服務對於機器人來說也許是個難題,但並不是什麼不可能完成的任務。
(2)人格魅力的能力。機器提供的服務,不會有人格魅力,也不會感動人心。
評述:人格,貼一下網路的定義 「人格是一種具有自我意識和自我控制能力,具有感覺,情感,意志等機能的主體。」人格(心理學術語)_網路,講的是個性和情感,那我就要反問的為啥機器人沒情感呢?那我就要講微軟前EVP陸奇發布的情感計算框架了。微軟全球執行副總裁陸奇談人工智慧:情感計算框架顯EQ「溫度」,包括2015build上發布的cortana,就已經讓很多宅男發出了要女票何用的感慨(╯‵□′)╯︵┻━┻。有興趣的人可以去看2015的build。我認為人工智慧未來會發展成光環里的Cortana,或者使命召喚13里的伊森。而且我認為他們是有人格的,或許現狀是情感這方面做的並不好,但發展起來未來也許並不會比人差吧。囧

❸ TLS 詳解

SSL (Secure Sockets Layer) 安全套接層,是一種安全協議,經歷了 SSL 1.0、2.0、3.0 版本後發展成了標准安全協議 - TLS (Transport Layer Security) 傳輸層安全性協議。TLS 有 1.0 (RFC 2246)、1.1(RFC 4346)、1.2(RFC 5246)、1.3(RFC 8446) 版本。

TLS 在實現上分為 記錄層 握手層 兩層,其中握手層又含四個子協議: 握手協議 (handshake protocol)、更改加密規范協議 (change cipher spec protocol)、應用數據協議 (application data protocol) 和警告協議 (alert protocol)

只需配置瀏覽器和伺服器相關設置開啟 TLS,即可實現 HTTPS,TLS 高度解耦,可裝可卸,與上層高級應用層協議相互協作又相互獨立。

TLS/SSL 的功能實現主要依賴於三類基本演算法:散列函數 Hash、對稱加密和非對稱加密,其利用非對稱加密實現身份認證和密鑰協商,對稱加密演算法採用協商的密鑰對數據加密,基於散列函數驗證信息的完整性。

TLS 的基本工作方式是,客戶端使用非對稱加密與伺服器進行通信,實現身份驗證並協商對稱加密使用的密鑰,然後對稱加密演算法採用協商密鑰對信息以及信息摘要進行加密通信,不同的節點之間採用的對稱密鑰不同,從而可以保證信息只能通信雙方獲取。

例如,在 HTTPS 協議中,客戶端發出請求,服務端會將公鑰發給客戶端,客戶端驗證過後生成一個密鑰再用公鑰加密後發送給服務端(非對稱加密),雙方會在 TLS 握手過程中生成一個協商密鑰(對稱密鑰),成功後建立加密連接。通信過程中客戶端將請求數據用協商密鑰加密後發送,服務端也用協商密鑰解密,響應也用相同的協商密鑰。後續的通信使用對稱加密是因為對稱加解密快,而握手過程中非對稱加密可以保證加密的有效性,但是過程復雜,計算量相對來說也大。

記錄協議負責在傳輸連接上交換的所有底層消息,並且可以配置加密。每一條 TLS 記錄以一個短標頭開始。標頭包含記錄內容的類型 (或子協議)、協議版本和長度。原始消息經過分段 (或者合並)、壓縮、添加認證碼、加密轉為 TLS 記錄的數據部分。

記錄層將信息塊分割成攜帶 2^14 位元組 (16KB) 或更小塊的數據的 TLSPlaintext 記錄。

記錄協議傳輸由其他協議層提交給它的不透明數據緩沖區。如果緩沖區超過記錄的長度限制(2^14),記錄協議會將其切分成更小的片段。反過來也是可能的,屬於同一個子協議的小緩沖區也可以組合成一個單獨的記錄。

壓縮演算法將 TLSPlaintext 結構轉換為 TLSCompressed 結構。如果定義 CompressionMethod 為 null 表示不壓縮

流加密(BulkCipherAlgorithm)將 TLSCompressed.fragment 結構轉換為流 TLSCiphertext.fragment 結構

MAC 產生方法如下:

seq_num(記錄的序列號)、hash(SecurityParameters.mac_algorithm 指定的哈希演算法)

塊加密(如 RC2 或 DES),將 TLSCompressed.fragment 結構轉換為塊 TLSCiphertext.fragment 結構

padding: 添加的填充將明文長度強制為塊密碼塊長度的整數倍。填充可以是長達 255 位元組的任何長度,只要滿足 TLSCiphertext.length 是塊長度的整數倍。長度大於需要的值可以阻止基於分析交換信息長度的協議攻擊。填充數據向量中的每個 uint8 必須填入填充長度值 (即 padding_length)。

padding_length: 填充長度應該使得 GenericBlockCipher 結構的總大小是加密塊長度的倍數。合法值范圍從零到 255(含)。 該長度指定 padding_length 欄位本身除外的填充欄位的長度

加密塊的數據長度(TLSCiphertext.length)是 TLSCompressed.length,CipherSpec.hash_size 和 padding_length 的總和加一

加密和 MAC 功能將 TLSCompressed 結構轉換為 TLSCiphertext。記錄的 MAC 還包括序列號,以便可以檢測到丟失,額外或重復的消息。

記錄協議需要一種演算法,從握手協議提供的安全性參數生成密鑰、 IV 和 MAC secret.

主密鑰 (Master secret): 在連接中雙方共享的一個 48 位元組的密鑰
客戶隨機數 (client random): 由客戶端提供的 32 位元組值
伺服器隨機數 (server random): 由伺服器提供的 32 位元組值

握手是 TLS 協議中最精密復雜的部分。在這個過程中,通信雙方協商連接參數,並且完成身 份驗證。根據使用的功能的不同,整個過程通常需要交換 6~10 條消息。根據配置和支持的協議擴展的不同,交換過程可能有許多變種。在使用中經常可以觀察到以下三種流程:(1) 完整的握手, 對伺服器進行身份驗證;(2) 恢復之前的會話採用的簡短握手;(3) 對客戶端和伺服器都進行身份驗證的握手。

握手協議消息的標頭信息包含消息類型(1 位元組)和長度(3 位元組),餘下的信息則取決於消息類型:

每一個 TLS 連接都會以握手開始。如果客戶端此前並未與伺服器建立會話,那麼雙方會執行一次完整的握手流程來協商 TLS 會話。握手過程中,客戶端和伺服器將進行以下四個主要步驟:

下面介紹最常見的握手規則,一種不需要驗證客戶端身份但需要驗證伺服器身份的握手:

這條消息將客戶端的功能和首選項傳送給伺服器。

是將伺服器選擇的連接參數傳回客戶端。

這個消息的結構與 ClientHello 類似,只是每個欄位只包含一個選項,其中包含服務端的 random_S 參數 (用於後續的密鑰協商)。伺服器無需支持客戶端支持的最佳版本。如果伺服器不支持與客戶端相同的版本,可以提供某個其他版本以期待客戶端能夠接受

圖中的 Cipher Suite 是後續密鑰協商和身份驗證要用的加密套件,此處選擇的密鑰交換與簽名演算法是 ECDHE_RSA,對稱加密演算法是 AES-GCM,後面會講到這個

還有一點默認情況下 TLS 壓縮都是關閉的,因為 CRIME 攻擊會利用 TLS 壓縮恢復加密認證 cookie,實現會話劫持,而且一般配置 gzip 等內容壓縮後再壓縮 TLS 分片效益不大又額外佔用資源,所以一般都關閉 TLS 壓縮

典型的 Certificate 消息用於攜帶伺服器 X.509 證書鏈 。
伺服器必須保證它發送的證書與選擇的演算法套件一致。比方說,公鑰演算法與套件中使用的必須匹配。除此以外,一些密鑰交換演算法依賴嵌入證書的特定數據,而且要求證書必須以客戶端支持的演算法簽名。所有這些都表明伺服器需要配置多個證書(每個證書可能會配備不同的證書鏈)。

Certificate 消息是可選的,因為並非所有套件都使用身份驗證,也並非所有身份驗證方法都需要證書。更進一步說,雖然消息默認使用 X.509 證書,但是也可以攜帶其他形式的標志;一些套件就依賴 PGP 密鑰

攜帶密鑰交換需要的額外數據。ServerKeyExchange 是可選的,消息內容對於不同的協商演算法套件會存在差異。部分場景下,比如使用 RSA 演算法時,伺服器不需要發送此消息。

ServerKeyExchange 僅在伺服器證書消息(也就是上述 Certificate 消息)不包含足夠的數據以允許客戶端交換預主密鑰(premaster secret)時才由伺服器發送。

比如基於 DH 演算法的握手過程中,需要單獨發送一條 ServerKeyExchange 消息帶上 DH 參數:

表明伺服器已經將所有預計的握手消息發送完畢。在此之後,伺服器會等待客戶端發送消息。

客戶端驗證證書的合法性,如果驗證通過才會進行後續通信,否則根據錯誤情況不同做出提示和操作,合法性驗證內容包括如下:

由 PKI 體系 的內容可知,對端發來的證書簽名是 CA 私鑰加密的,接收到證書後,先讀取證書中的相關的明文信息,採用相同的散列函數計算得到信息摘要,然後利用對應 CA 的公鑰解密簽名數據,對比證書的信息摘要,如果一致,則可以確認證書的合法性;然後去查詢證書的吊銷情況等

合法性驗證通過之後,客戶端計算產生隨機數字的預主密鑰(Pre-master),並用證書公鑰加密,發送給伺服器並攜帶客戶端為密鑰交換提供的所有信息。這個消息受協商的密碼套件的影響,內容隨著不同的協商密碼套件而不同。

此時客戶端已經獲取全部的計算協商密鑰需要的信息: 兩個明文隨機數 random_C 和 random_S 與自己計算產生的 Pre-master,然後得到協商密鑰(用於之後的消息加密)

圖中使用的是 ECDHE 演算法,ClientKeyExchange 傳遞的是 DH 演算法的客戶端參數,如果使用的是 RSA 演算法則此處應該傳遞加密的預主密鑰

通知伺服器後續的通信都採用協商的通信密鑰和加密演算法進行加密通信

Finished 消息意味著握手已經完成。消息內容將加密,以便雙方可以安全地交換驗證整個握手完整性所需的數據。

這個消息包含 verify_data 欄位,它的值是握手過程中所有消息的散列值。這些消息在連接兩端都按照各自所見的順序排列,並以協商得到的主密鑰 (enc_key) 計算散列。這個過程是通過一個偽隨機函數(pseudorandom function,PRF)來完成的,這個函數可以生成任意數量的偽隨機數據。
兩端的計算方法一致,但會使用不同的標簽(finished_label):客戶端使用 client finished,而伺服器則使用 server finished。

因為 Finished 消息是加密的,並且它們的完整性由協商 MAC 演算法保證,所以主動網路攻擊者不能改變握手消息並對 vertify_data 的值造假。在 TLS 1.2 版本中,Finished 消息的長度默認是 12 位元組(96 位),並且允許密碼套件使用更長的長度。在此之前的版本,除了 SSL 3 使用 36 位元組的定長消息,其他版本都使用 12 位元組的定長消息。

伺服器用私鑰解密加密的 Pre-master 數據,基於之前交換的兩個明文隨機數 random_C 和 random_S,同樣計算得到協商密鑰: enc_key = PRF(Pre_master, "master secret", random_C + random_S) ;

同樣計算之前所有收發信息的 hash 值,然後用協商密鑰解密客戶端發送的 verify_data_C,驗證消息正確性;

服務端驗證通過之後,伺服器同樣發送 change_cipher_spec 以告知客戶端後續的通信都採用協商的密鑰與演算法進行加密通信(圖中多了一步 New Session Ticket,此為會話票證,會在會話恢復中解釋);

伺服器也結合所有當前的通信參數信息生成一段數據 (verify_data_S) 並採用協商密鑰 session secret (enc_key) 與演算法加密並發送到客戶端;

客戶端計算所有接收信息的 hash 值,並採用協商密鑰解密 verify_data_S,驗證伺服器發送的數據和密鑰,驗證通過則握手完成;

開始使用協商密鑰與演算法進行加密通信。

HTTPS 通過 TLS 層和證書機制提供了內容加密、身份認證和數據完整性三大功能。加密過程中,需要用到非對稱密鑰交換和對稱內容加密兩大演算法。

對稱內容加密強度非常高,加解密速度也很快,只是無法安全地生成和保管密鑰。在 TLS 協議中,最後的應用數據都是經過對稱加密後傳輸的,傳輸中所使用的對稱協商密鑰(上文中的 enc_key),則是在握手階段通過非對稱密鑰交換而來。常見的 AES-GCM、ChaCha20-Poly1305,都是對稱加密演算法。

非對稱密鑰交換能在不安全的數據通道中,產生只有通信雙方才知道的對稱加密密鑰。目前最常用的密鑰交換演算法有 RSA 和 ECDHE。

RSA 歷史悠久,支持度好,但不支持 完美前向安全 - PFS(Perfect Forward Secrecy) ;而 ECDHE 是使用了 ECC(橢圓曲線)的 DH(Diffie-Hellman)演算法,計算速度快,且支持 PFS。

在 PKI 體系 一節中說明了僅有非對稱密鑰交換還是無法抵禦 MITM 攻擊的,所以需要引入了 PKI 體系的證書來進行身份驗證,其中服務端非對稱加密產生的公鑰會放在證書中傳給客戶端。

在 RSA 密鑰交換中,瀏覽器使用證書提供的 RSA 公鑰加密相關信息,如果服務端能解密,意味著服務端擁有與公鑰對應的私鑰,同時也能算出對稱加密所需密鑰。密鑰交換和服務端認證合並在一起。

在 ECDH 密鑰交換中,服務端使用私鑰 (RSA 或 ECDSA) 對相關信息進行簽名,如果瀏覽器能用證書公鑰驗證簽名,就說明服務端確實擁有對應私鑰,從而完成了服務端認證。密鑰交換則是各自發送 DH 參數完成的,密鑰交換和服務端認證是完全分開的。

可用於 ECDHE 數字簽名的演算法主要有 RSA 和 ECDSA - 橢圓曲線數字簽名演算法 ,也就是目前密鑰交換 + 簽名有三種主流選擇:

比如我的網站使用的加密套件是 ECDHE_RSA,可以看到數字簽名演算法是 sha256 哈希加 RSA 加密,在 PKI 體系 一節中講了簽名是伺服器信息摘要的哈希值加密生成的

內置 ECDSA 公鑰的證書一般被稱之為 ECC 證書,內置 RSA 公鑰的證書就是 RSA 證書。因為 256 位 ECC Key 在安全性上等同於 3072 位 RSA Key,所以 ECC 證書體積比 RSA 證書小,而且 ECC 運算速度更快,ECDHE 密鑰交換 + ECDSA 數字簽名是目前最好的加密套件

以上內容來自本文: 開始使用 ECC 證書

關於 ECC 證書的更多細節可見文檔: ECC Cipher Suites for TLS - RFC4492

使用 RSA 進行密鑰交換的握手過程與前面說明的基本一致,只是沒有 ServerKeyExchange 消息,其中協商密鑰涉及到三個參數 (客戶端隨機數 random_C、服務端隨機數 random_S、預主密鑰 Premaster secret),
其中前兩個隨機數和協商使用的演算法是明文的很容易獲取,最後一個 Premaster secret 會用伺服器提供的公鑰加密後傳輸給伺服器 (密鑰交換),如果這個預主密鑰被截取並破解則協商密鑰也可以被破解。

RSA 演算法的細節見: wiki 和 RSA演算法原理(二)- 阮一峰

RSA 的演算法核心思想是利用了極大整數 因數分解 的計算復雜性

而使用 DH(Diffie-Hellman) 演算法 進行密鑰交換,雙方只要交換各自的 DH 參數(在 ServerKeyExchange 發送 Server params,在 ClientKeyExchange 發送 Client params),不需要傳遞 Premaster secret,就可以各自算出這個預主密鑰

DH 的握手過程如下,大致過程與 RSA 類似,圖中只表達如何生成預主密鑰:

伺服器通過私鑰將客戶端隨機數 random_C,服務端隨機數 random_S,服務端 DH 參數 Server params 簽名生成 signature,然後在 ServerKeyExchange 消息中發送服務端 DH 參數和該簽名;

客戶端收到後用伺服器給的公鑰解密驗證簽名,並在 ClientKeyExchange 消息中發送客戶端 DH 參數 Client params;

服務端收到後,雙方都有這兩個參數,再各自使用這兩個參數生成預主密鑰 Premaster secret,之後的協商密鑰等步驟與 RSA 基本一致。

關於 DH 演算法如何生成預主密鑰,推薦看下 Wiki 和 Ephemeral Diffie-Hellman handshake

其核心思想是利用了 離散對數問題 的計算復雜性

演算法過程可以抽象成下圖:

雙方預先商定好了一對 P g 值 (公開的),而 Alice 有一個私密數 a(非公開,對應一個私鑰),Bob 有一個私密數 b(非公開,對應一個私鑰)

對於 Alice 和 Bob 來說通過對方發過來的公鑰參數和自己手中的私鑰可以得到最終相同的密鑰

而第三方最多知道 P g A B,想得到私鑰和最後的密鑰很困難,當然前提是 a b P 足夠大 (RFC3526 文檔中有幾個常用的大素數可供使用),否則暴力破解也有可能試出答案,至於 g 一般取個較小值就可以

如下幾張圖是實際 DH 握手發送的內容:

可以看到雙方發給對方的參數中攜帶了一個公鑰值,對應上述的 A 和 B

而且實際用的加密套件是 橢圓曲線 DH 密鑰交換 (ECDH) ,利用由橢圓曲線加密建立公鑰與私鑰對可以更進一步加強 DH 的安全性,因為目前解決橢圓曲線離散對數問題要比因式分解困難的多,而且 ECC 使用的密鑰長度比 RSA 密鑰短得多(目前 RSA 密鑰需要 2048 位以上才能保證安全,而 ECC 密鑰 256 位就足夠)

關於 橢圓曲線密碼學 - ECC ,推薦看下 A Primer on Elliptic Curve Cryptography - 原文 - 譯文

盡管可以選擇對任意一端進行身份驗證,但人們幾乎都啟用了對伺服器的身份驗證。如果伺服器選擇的套件不是匿名的,那麼就需要在 Certificate 消息中跟上自己的證書。

相比之下,伺服器通過發送 CertificateRequest 消息請求對客戶端進行身份驗證。消息中列出所有可接受的客戶端證書。作為響應,客戶端發送自己的 Certificate 消息(使用與伺服器發送證書相同的格式),並附上證書。此後,客戶端發送 CertificateVerify 消息,證明自己擁有對應的私鑰。

只有已經過身份驗證的伺服器才被允許請求客戶端身份驗證。基於這個原因,這個選項也被稱為相互身份驗證(mutual authentication)。

在 ServerHello 的過程中發出,請求對客戶端進行身份驗證,並將其接受的證書的公鑰和簽名演算法傳送給客戶端。

它也可以選擇發送一份自己接受的證書頒發機構列表,這些機構都用其可分辨名稱來表示:

在 ClientKeyExchange 的過程中發出,證明自己擁有的私鑰與之前發送的客戶端證書中的公鑰匹配。消息中包含一條到這一步為止的所有握手消息的簽名:

最初的會話恢復機制是,在一次完整協商的連接斷開時,客戶端和伺服器都會將會話的安全參數保存一段時間。希望使用會話恢復的伺服器為會話指定唯一的標識,稱為會話 ID(Session ID)。伺服器在 ServerHello 消息中將會話 ID 發回客戶端。

希望恢復早先會話的客戶端將適當的 Session ID 放入 ClientHello 消息,然後提交。伺服器如果同意恢復會話,就將相同的 Session ID 放入 ServerHello 消息返回,接著使用之前協商的主密鑰生成一套新的密鑰,再切換到加密模式,發送 Finished 消息。
客戶端收到會話已恢復的消息以後,也進行相同的操作。這樣的結果是握手只需要一次網路往返。

Session ID 由伺服器端支持,協議中的標准欄位,因此基本所有伺服器都支持,伺服器端保存會話 ID 以及協商的通信信息,佔用伺服器資源較多。

用來替代伺服器會話緩存和恢復的方案是使用會話票證(Session ticket)。使用這種方式,除了所有的狀態都保存在客戶端(與 HTTP Cookie 的原理類似)之外,其消息流與伺服器會話緩存是一樣的。

其思想是伺服器取出它的所有會話數據(狀態)並進行加密 (密鑰只有伺服器知道),再以票證的方式發回客戶端。在接下來的連接中,客戶端恢復會話時在 ClientHello 的擴展欄位 session_ticket 中攜帶加密信息將票證提交回伺服器,由伺服器檢查票證的完整性,解密其內容,再使用其中的信息恢復會話。

這種方法有可能使擴展伺服器集群更為簡單,因為如果不使用這種方式,就需要在服務集群的各個節點之間同步會話。
Session ticket 需要伺服器和客戶端都支持,屬於一個擴展欄位,佔用伺服器資源很少。

❹ diff演算法阮一峰

Diff演算法是虛擬DOM的核心,用於比較新舊虛擬DOM樹之間的差異,實現最小量更新。以下是關於Diff演算法的詳細解答:

  1. Diff演算法的作用

    • Diff演算法用於計算出Virtual DOM中被改變的部分,然後針對該部分進行原生DOM操作,而不用重新渲染整個頁面。
    • 它通過比較新舊虛擬DOM樹,找出差異,然後以最小化的方式更新真實DOM,從而提高頁面渲染效率。
  2. Diff演算法的策略

    • Walk:遍歷新舊虛擬DOM樹,對比節點,並記錄差異。
    • Update:根據差異進行更新。如果節點類型不同,直接替換整個節點;如果節點類型相同,則比較其屬性和子節點。
    • Diff Attributes:比較節點的屬性差異,並根據差異進行更新。
  3. Diff演算法在Vue和React中的應用

    • 在Vue中,每個組件都有一個對應的虛擬DOM樹,當數據發生改變時,Vue會重新計算虛擬DOM樹的結構,並與舊的虛擬DOM樹進行比較,然後使用Diff演算法找出差異並進行更新。
    • React也使用了類似的虛擬DOM和Diff演算法機制,通過遍歷newChildren和oldFiber進行比較,實現高效的DOM更新。
  4. Diff演算法中的key作用

    • 在使用虛擬DOM進行Diff演算法時,為了正確識別節點並找到正確的位置插入新的節點,需要給每個節點設置一個唯一的標識key。
    • 通過key,Diff演算法可以更快地定位到需要更新的節點,從而提高更新效率。
  5. Diff演算法在股票MACD指標中的應用

    • 需要注意的是,雖然都提到了「Diff」,但股票MACD指標中的DIFF與虛擬DOM中的Diff演算法是兩個不同的概念。
    • MACD中的DIFF線代表的是收盤價短期、長期指數平滑移動平均線之間的差,是MACD指標的短期指標,用於分析股票市場的趨勢。
  6. Diff演算法的性能優化

    • 對於大型JSON數據的比對,可以考慮使用哈希索引優化搜索,以及使用並行處理等技術來提高比對效率。
    • 此外,通過減少不必要的數據更新和比對,也可以進一步優化Diff演算法的性能。

綜上所述,Diff演算法是虛擬DOM的核心機制之一,通過比較新舊虛擬DOM樹之間的差異,實現最小量更新,從而提高頁面渲染效率。在Vue和React等前端框架中得到了廣泛應用。

閱讀全文

與阮一峰演算法相關的資料

熱點內容
mscoreedll是什麼文件夾修復 瀏覽:697
什麼app測臉型 瀏覽:43
cf手游刀戰演算法 瀏覽:318
北京壓縮米飯 瀏覽:553
施工員與程序員哪個好 瀏覽:207
vc與word編程 瀏覽:950
androidmenu文字顏色 瀏覽:983
安卓手機玩游戲怎麼會閃退 瀏覽:553
聲控解壓球要晾幾天才能晾乾呢 瀏覽:562
安卓手機拍照如何自動調整 瀏覽:627
程序員必知 瀏覽:22
cs16bot命令 瀏覽:869
馬六壓縮機不工作 瀏覽:407
c語言使用命令 瀏覽:781
初遇是個什麼app 瀏覽:744
編譯依賴包下載 瀏覽:879
excel表格數據加密怎麼解密 瀏覽:475
外國安卓手機圖片加密 瀏覽:724
帝國時代2電腦解壓包 瀏覽:614
安卓機在國外怎麼用 瀏覽:993