接觸openssl已經有一段時間了,我讀過很多原始碼,感覺不錯的也就那麼幾個,linux核心是其中之 一,openssl也是其中之一。openssl說白了不是什麼功能性的東西,而是提供了乙個支撐性的底層框架,本質上和linux核心一樣,但是和 apache有區別,apache明確的實現了乙個功能,就是web伺服器,而openssl中我認為最重要的就是它提供的bio框架和evp框架,與其 說openssl是乙個ssl的實現不如說ssl只不過是openssl框架的乙個demo,本質上openssl提供了一套抽象的io介面,這就是 bio,還有一套很容易使用的加密解密介面,這就是evp,最後證實ssl這個協議使用了上述兩類介面,如果從這個意義上講的話,apache其實也是這 樣的,在構建頂層的web伺服器之前首先實現了一套apr通用框架,甚至memcahce使用的libevent也是這樣,這就是說很多的成功的開源的代 碼與其說是一種專用的程式倒不如說包含有一套通用的框架,而這個帶**的原始意義最後退化成了使用這個通用框架的乙個例項,最起碼我看好的幾個開源專案都 是這樣。策略和機制分離,可擴充套件性十分棒,用起來十分靈活。
openssl總的來說由三部分組成,乙個是bio,乙個是evp,還有乙個就是構建於二者之上的ssl實現。研究這套**實現給我們可以帶來很多的啟 示,其中最重要的我想就是io的意義,還是先拿linux核心來說事吧,其實多工作業系統提供給使用者n臺馮諾依曼機器,不但將邏輯抽象給了使用者,而且將 大部分cpu指令也抽象給了使用者,唯獨不包括io指令,因為外設不是多工的,外設無法自己處理好多個任務的互斥關係,所有的多個任務共享乙個外設,因此 作業系統核心必須進行管理,這就是作業系統核心提供的io系統呼叫的作用,也就是說io指令必須通過系統呼叫進入作業系統核心之後讓核心幫忙處理。以上就 是io的意義,對於openssl提供bio介面其實意義和上面的差不多,不同的是在原始的io指令傳送給作業系統之前提供了使用者處理的機會,也就是說用 戶可以過濾傳送給核心的io系統呼叫的訊息,比如加密,分段等等。如果按照網路的觀點,協議棧提供一幅和io截然不同的圖景,雖然協議棧最終也要將資料給 了網絡卡和電纜,但是網絡卡作為乙個外設的意義被更抽象的物理層和鏈路層取代了,人們不再認為傳送網路資料就是共享網絡卡外設或者電纜,而更多討論乙太網 csma/cd模型,或者ppp鏈路規程之類的抽象的概念,因此對於網路資料的io,協議棧將一切都抽象了,一切都抽象成了分層的模型,這就是分層模型的 重大意義,人們可以在共享的網絡卡和電纜上傳送不共享的資料,一切井井有條。不像普通的印表機資料傳送,網路資料的傳送方式截然不同,如果你想傳送資料給打 印機,那麼首先你必須首先得到印表機的檔案描述符,如果另乙個使用者也要傳送資料給印表機,那麼作業系統核心的檔案系統模組此時將協調它們的順序,如果網路 資料的話,協議棧就搞定了一切,在使用者層不需要類似的檔案描述符的概念,而相同意義的概念就是套接字,需要乙個ip位址和乙個埠號,這就是協議棧的功 能,然後協議棧會將資料一直傳輸到最底層的物理層,這種方式看起來要比檔案的方式更加直觀,因此unix/linux中沒有將網絡卡抽象成裝置檔案,畢竟協 議棧完成了相同的功能。當然套接字介面還是和檔案介面相統一的,但是這僅僅是為了操作的統一和方便,普通的裝置將通過開啟乙個裝置檔案的方式得到檔案描述 符,而套接字的方式完全按照協議棧的要求,需要提供乙個ip位址和乙個埠號以及協議族。在openssl中,你既可以通過普通io的方式也就是說裝置文 件的方式擴充套件傳統io模型,也可以使用網路協議棧的方式擴充套件io模型,實際上openssl框架將二者統一成為一體。
首先,如果使用普通的裝置檔案方式的io,那麼我們只需要bio就可以了,因為bio是鏈式的,所以你可以隨意進行io過濾,如果想擴充套件網路協議棧,魯迅 式的廢話就是同樣只需要bio就可以了,但是條件是最下面的bio必須是乙個套接字,因為我們要在應用層擴充套件並且只能在應用層擴充套件,那麼就必然要在套接字 之上擴充套件,ssl就是在普通套接字之上加入了安全保護功能。bio統一了兩種方式,其實目前為止也就這兩種io的方式,一種是以可以抽象為裝置檔案的裝置 為載體的io,這種io又可細分為塊裝置和字元裝置的io,對於塊裝置往往通過檔案系統來訪問;另一種以網路協議棧方式進行的網路io,協議棧實現幾乎一 切流程,整個協議棧的分層模型和檔案系統/裝置驅動的分層模型類似,openssl的bio可以包容這二者的任何一種,並且還可以混合它們,本質上bio 可以組合成通向世界任何乙個地方的管道。
對於evp,它提供了很多易用的加密解密介面函式,openssl本身已經自帶了很多加密解密演算法,利用這套evp介面,你甚至可以輕鬆實現自己的加密解 密演算法。evp介面中封裝了演算法的流程,具體的演算法由不同的策略來填充,這一點上所有優秀的東西幾乎是一致的。
openssl匯出的介面是十分容易使用的,基本都是一看宣告就知道其用處。以下這個例子讀取並且解析乙個證書:
x509 * cert = null;
bio *pbio = bio_new_file((const char*)strpath, "r");
cert = pem_read_bio_x509(pbio,null,null,null);
閒談組合模式 基於UI動畫框架
先來看下組合模式的定義 將物件組合成樹型結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。這個定義看起來舒服一點。再看一下類圖 組合模式的關鍵是抽象乙個類,既可以表示葉子物件,又可以表示組合物件,所以葉子物件和組合物件都要從統一的介面類派生,這樣客戶 就可以...
Django框架 基礎教程(總)
django是乙個開放源 的web應用框架,由python寫成。django遵守bsd版權,初次發布於2005年7月,並於2008年9月發布了第乙個正式版本1.0 mvc框架,全稱角model view controller,是軟體工程的一種架構模式,這個模式把軟體系統分為三個部分 模型 model...
黑馬程式設計師 OC FOUNDATION框架總結
asp.net unity開發 net培訓 期待與您交流!1.nsstring字串的使用,nsstring物件,一旦建立,就不可以進行再改變,如需要乙個可以更改的字元 串物件,需要建立nsstring的可變子類nsmutablestring.字串的建立 1.2 建立乙個字串常量 nsstring s...