筆者在逛知乎的過程當中,偶然看見了一篇關於介紹網絡安全的文章當中談論到了關於HTTP/HTTPS,和一些密碼保存的相關的東西,甚是有興趣,文中談到登陸過程當中必定要使用HTTPS而不能使用HTTP,否者中間人攻擊將很容易取得用戶的密碼,若是帶點鑽牛角尖做者的這個說法恐怕並不是正確,密碼的安全性並不能由於使用了HTTPS就高枕無憂,也並不是使用了HTTP就不安全.算法
上面這句話你可能看的一頭霧水,不過這沒有關係,這只是拋磚引玉的幾句牢騷,同時這也是筆者寫這篇文章的緣由,一是科普下數據安全的那些事,二是順便帶你們初步的瞭解一下有關於密碼的知識,固然讀者不用擔憂,筆者並不打算談論過多的數學方面的東西,你徹底能夠把本文當故事書來看.不過有些地方恕筆者口拙,仍然不可避免的添加一點點不太複雜的理論基礎,同時筆者並不是全才也非研究密碼學數論的專業人士,談吐之餘可能還添加了新的錯誤,仍望讀者見諒指正.chrome
在開始討論關於密碼安全以前,筆者很願意先給你們講述一些小故事,以達到增長文章閱讀趣味的功效,咱們先來看看,假如你打算給你的GG或者是MM眉目傳情好在某個愉快的時間唱着歌兒吃着火鍋幹着快活事兒那你該怎麼辦?數據庫
固然,眉目傳情這招技術難度實在過高,除了心有靈犀一點通以外畢竟不是誰都可以有那能耐靠擠眉弄眼就能搞明白對方想表達的是什麼意思,好比你想表達明天下午三點這個概念,恐怕除了眼睛嘴巴外還得用上你的手,你想表達帶100塊錢好在明晚能買兩張電影票這個信息時,恐怕你連腳指頭用上也不夠了,鑑於眉目傳情無論是技術上仍是生理上的不靠譜,若是你活在90年代手機還沒普及,那寫信確實是個好辦法.不過在這個早戀還容易被家長批鬥的年代,若是直接在信上寫安全
darling, lets go to the movies tonight(親愛的,咱們今晚去看電影吧)markdown
恐怕得帶着底下工做黨被抓犧牲的覺悟了,若是你不想你美好的初戀讓由於信息泄露讓整個學校都知道,你恐怕就得對這些文字進行一番處理,作起來也並不困難,最初級的辦法是對單詞進行混亂或替換,好比你能夠和你可愛的GG或者MM約定,加密時將d-\>c,a-\>b,r-\>s,l-\>m,i-\>j,…..也就是每一個單詞在字母表中日後移一位最後z-\>a完成一個閉環,在閱讀時再將它們給移動回來,
例如darling通過變換後變成了cbsmjoh這樣傳輸的信息就沒人能懂了.網絡
這個辦法簡直棒極了,對於傳輸情書這樣的事情,彷佛也用不到一羣密碼學專家進行解密,所以你大可放心的用這個辦法傳遞你想表達的意思,這值的膨脹膨脹,莫不我是個天才,不過遺憾的是這個辦法恐怕並不能讓你申請專利,凱撒大帝在幾百年前就用這種辦法來傳遞軍事情報了架構
<ignore_js_op>函數
但無論怎麼樣,這個加密手法簡單粗暴有效,也不用花多少心思去理解,只要像上面這樣製做一個對應表,就可以完成一段信息的加密與解密,若是你以爲不放心的話,你大可用更加混亂無序的一張映射表來完成這個加解密,這樣就能粉碎那些想要琢磨你單詞在字母表上到底後移幾位的八卦狗仔隊們的破解了.性能
這種加密被用了很長時間,甚至在軍事上,並且一直工做的不錯,蘇格蘭的瑪麗女王正是使用這種加密方法來完成不少祕密消息的傳遞,不過事實也證實了,她確實被這個辦法給坑慘了:),固然本文並不打算介紹瑪麗女王是如何用這種加密方法同別人密謀造反而後被拆穿被續的,咱們把注意力放在她的密碼是如何敗露的,如今你可能疑惑,這個加密的問題出在哪了,看上去確實木有啥問題啊,但實際上破解的方法卻很簡單,不須要你具有多麼高深的密碼學數論編碼學方面的知識,只要稍微瞭解下統計學的東西就能夠了.那麼是如何辦到的呢,你能夠翻開一本英文書,而後從頭看到尾,而後你能夠數數當中的字母a佔全部字母的幾成,字母b佔幾成….也許你已經發現當中的區別,是的,若是你統計了足夠多的文章,你會發現這些單詞出現的可能性大概就在某個範圍以內,這種替換法也許替換了原來的單詞,卻沒法替換它出現的機率,當破譯者經過某些手段收集了足夠多的瑪麗女王的密文信件時,他就可以經過這種辦法來破譯出明文了,也正是這樣,強度不夠的加密手段讓瑪麗女王最終由於事情敗露而上了斷頭臺.學習
這個故事可能講的有點長,但它卻表達了筆者想要表述的幾個概念,一種是加密是什麼,顯然的,加密是將一種信息表達變成另一種信息表達的方式,一個很現實的比方是在外地你和你老鄉交談用的多是大家家鄉的方言,儘管你用普通話表達」我愛香菜」和用方言表達」我愛香菜」是一個意思,但用方言表述不是你家鄉的人恐怕聽不懂,另外一種就是映射關係了,就像上面的對應表,實際上你能夠叫它映射表,沒錯
,無非就是把一串數據對應某種關係變成另一串數據.
儘管咱們知道了上面的這種映射加密有多麼的不靠譜,固然這種不靠譜的加密仍是有個名字就是叫」凱撒加密」,通過了幾個世紀的發展,通過衆多的數學家密碼學物理學甚至是生物學….家的努力,咱們最終仍是開發出了很多靠譜的加密方式,在這裏,由於咱們主要討論的是計算機相關的東西,因此筆者也得用數學的方式(信號與系統?)的方式來描述一下了.
假設咱們將沒有加密過的信息叫明文(A),加密後的信息叫密文(C),設B爲加密方式,那麼加密的過程就能夠寫成相似
A*B=C
固然,解密過程就是
C*D=A
其中D表示B的逆,也就是解密過程了.
經過上面的故事咱們很容易理解一個加密的過程,舉個很是通俗易懂的栗子,假如咱們有五個數字要告訴對方,分別是1,2,3,4,5加密就是將每一個數字乘以2,對面因而就收到了密文2,4,6,8,10最後,對面只須要將每一個數字除以2就能取得明文1,2,3,4,5了,在這個過程當中,2做爲整個加密過程當中最關鍵的數字,能夠說是整個加密解密的鑰匙,你就得好好保存了,一旦讓別人知道了你的密鑰,你的加密將形同虛設.
顯然的,上個章節說到的瑪麗女王並不是是本身不當心把本身的鑰匙泄漏了,但別人卻經過統計學的方式取得了她的鑰匙,雖然並非每一個人都能意識到字母在大量的文章書籍中的統計學關係,但咱們卻不得不面對一個更加直觀的問題,假如你和一個你不認識的人進行加密通信,你如何保證你的鑰匙能只交給你的接頭人呢.
固然,當面交易無論是在密碼仍是網購都屬於一個比較靠譜的方式,可是若是你想經過信件的方式,就是通過一堆不知名的郵差郵局最終才能到你的接頭人手中時,你就得擔憂擔憂中間有沒有人把你的鑰匙給拷貝了一份了.如今你面臨一個很是嚴重的問題,你沒法保證中間人會不會出賣你,然而你確不得不把本身手中的鑰匙交給他們,否者你的接頭人就沒法使用它來和你進行加密通信了.
儘管這種方式和咱們實際說的密碼學多多少少有一點不同,可是它的確給了咱們提示,設明文爲A,密鑰爲B,密文爲C,是否存在一種加密函數使得:
AB=C
CD=AB沒法推導出(至少推導的成本很大)D
簡單來講,就是加密的密鑰和解密的密鑰不同,這樣咱們就不用擔憂咱們的密鑰被泄漏了,
在現實有點像這麼一個過程
首先準備一個帶鎖的箱子,用鑰匙把這個箱子打開(公鑰)
把這個箱子交給郵遞員,同時箱子裏附上一個字條,上面寫着:請接頭人想一個咱們之間的通信加密方式,而後把密鑰也放在箱子裏鎖上寄回給我.(經過公鑰加密)
當這個鎖上的箱子再次回到你手中時,用鑰匙打開箱子,取得密鑰和加密方式(私鑰解密)
上面這個辦法完美地避免了中間人看到你和接頭人密鑰,畢竟在交回來時,它但是鎖在箱子裏面的,只要你發現收回來時這個箱子有什麼不對勁,你當即能夠編輯短信」
有內鬼,終止交易,」.
雖然最後放在數學中這個方式有點不一樣,但在思路上,倒是大同小異,你也許已經發現了在高中的階段,要計算3的五次方是多少遠比你算多少的5次方是218要簡單的多,當代的不對稱密鑰技術(公鑰加密),大多都用上了這種信息不對等的理念,也就是正推容易逆推難.
談到公鑰加密,就不得不聊聊目前至關有名的RSA和ECC了,相對於ECC,RSA理解起來就容易的多,RSA加密簡單來講利用了大數質因數分解的數學難題
好比如今你能夠隨便挑選兩個素數,好比59,83,而後將它們乘起來59*83=4897,這很容易,即便是一個小學生也能在十幾秒內算出來,可是若是我只告訴你4897這個數,而後讓你作因數分解,若是不信你能夠試試,不過八成你須要一個一個數去試試了,假如這兩個素數挑選的都很是大,那麼就算是超級計算機上場,恐怕也得算到世界末日了.儘管上面已經說了本文並不打算討論過多的數學方面的問題,但幸運的是,理解RSA加密並不複雜,即便是在這短短的篇幅中,也很容易將RSA的原理給講清楚.
定義兩個素數p,q設n = p*q
設k= ϕ(n)=(p-1)(q-1), ϕ(n)是歐拉函數,這個不熟悉能夠百度
挑選一個大於1小於k的數d,同時d與k互質
而後咱們挑選(e,n)做爲公鑰,將它發佈出去,(d,n)爲私鑰將它保存起來
那麼加密過程是怎麼樣的呢,咱們假設將明文編碼爲x,x與n互質設(圖片看不清請下載下來本身看)
<ignore_js_op>
<ignore_js_op>
就能夠了,固然口說無憑,咱們來證實一番
<ignore_js_op>
由於x和n互質,根據歐拉定理,
<ignore_js_op>
所以上式最終變爲了x%n=x,RSA得證,要破解RSA那麼關鍵就是找到這個d了,咱們看看d是怎麼來的,首先從點3咱們知道,要知道d首先要先知道k,而k=(p-1)(q-1)也就是須要知道p和q了,而咱們公佈的只有一個e和n,按照不成文的欽定就算e是65537,也就是說咱們必須經過n倒推出p和q,那麼,問題就變成了這個大數因數分解的世紀難題了,固然若是你有辦法解出來,給我回帖前我建議你先寫成論文,只要發表後這樣你就能夠先領取500萬美圓的獎金了(這仍是零幾年的價格,如今應該獎金應該足夠你在北京一環內買套豪華別墅).
RSA已經流行了多年,不少時刻彷彿這套理論就會被爆些大新聞讓人感受其安全性已經風雨飄搖,可是最終RSA仍然屹立不倒,些許在以後的某一天量子計算機誕生或者哪一個大神真正找到了某個快速大數的質因數分解的方法,RSA也算真正完成了他的歷史使命了.
公鑰加密技術有諸多的優勢,可是其缺點也同樣很明顯,大多的公鑰加密算法其性能開銷基本都比密鑰對稱加密大得多,所以,他們通常都不用於加密大量的數據,在實際使用中,它們大多被用於交換其它更加經濟快速的加密密鑰對,或者被設計與數字簽名,若是你想進一步瞭解RSA,那麼在在互聯網上的資料已是鋪天蓋地筆者便再也不復述了,若是你對其它的公鑰加密有興趣好比ECC,那麼也許筆者以後的\<\<小學生坐在馬桶上都看得懂的橢圓曲線加密原理\>\>你也許有興趣.
看到了標題你可能已經在犯咕咚,剛說完密碼怎麼忽然就跳到http/https上來了,不過不用擔憂,一個很是直觀的理解就是,http就是你用明文來寫情書,https就是你的情書加密了,實際上後者就是前者加密後的產物.那麼什麼是http呢,你能夠打開一個網站好比百度,若是你用的是chrome,那麼按下F12,你能夠看到有一堆文字
<ignore_js_op>
這段文字就是符合http規範的的文字(固然http協議相關的細節信息已經省略了),你能夠管它叫網站源代碼,或者簡單一點來講,就是這段文字通過解析後變成了你所看到的網頁,固然,這個源代碼在互聯網上傳輸,就像你把情書交給了一個不靠譜的郵遞員同樣不靠譜,這個郵遞員大可能已經被你的情敵收買了,把你的信件拆開來添油加醋地加一點東西而後再神不知鬼不覺地封回去這樣足夠給你形成一些情感危機了,但https可以很好的避免這一堆問題,由於這段文字被加密了,若是不知道解密手段的話,即便添加了一些東西解密後也會變成一堆意義不明的數據,收信方也很容易察覺出問題.所以,https顯然在防篡改方面比http要安全.
那麼是不是HTTPS就必定比HTTP安全呢,HTTP是否必定不安全呢,就像文中做者所說的,無論怎麼樣必定要使用HTTPS作密碼的登陸框,否則密碼就會被泄漏.
其實這句話,就有點像就算是屠龍寶刀若是給一個菜鳥的話,恐怕真到約架時,也會被砍的娘都不認識,就算是一根樹枝假如給的是獨孤求敗這種人物,就算是在多人一塊兒上也是被扁的哇哇叫,打鐵還需自身硬,若是自身都不夠硬,真要幹起架來,哪怕是再好的武器也於事無補.要理解HTTPS爲何安全,安全在哪裏,咱們就得有打破砂鍋問到底,不到禿頭不掉淚的精神以探其究竟.
在這裏,咱們進稍微一步地探究下細節,有關於HTTPS的傳輸流程是怎麼樣的,能夠看到,HTTPS比HTTP就多了一個字母S,這個S表明着SSL(Secure
Socket
Layer)的意思,也就是安全傳輸層,不要看名字那麼高大上,實際上用人話來說就和筆者第一章說的那個送箱子的過程差很少,首先SSL層先使用公鑰加密技術交換密鑰對(好比RSA,ECC….),以後再使用AES
DES或者更經濟點的RC4進行加密通信,看上去這個交遞箱子的方案彷佛沒有什麼問題,但咱們回到那個交遞箱子的過程
首先準備一個帶鎖的箱子,用鑰匙把這個箱子打開(公鑰)
把這個箱子交給郵遞員,同時箱子裏附上一個字條,上面寫着:請接頭人想一個咱們之間的通信加密方式,而後把密鑰也放在箱子裏鎖上寄回給我.(經過公鑰加密)
當這個鎖上的箱子再次回到你手中時,用鑰匙打開箱子,取得密鑰和加密方式(私鑰解密)
咱們作一個這個假設,假設這個郵遞員準備了一個和你如出一轍的箱子,而後假裝成你的接頭人和你通信,再用這個僞造的箱子和你真正的接頭人進行通信,那麼你還能保證你的通信是安全的麼.恐怕這個時候,即便是公鑰加密技術也無能爲力了,咱們能作的,只能是儘可能提醒接頭人,好比在箱子上蓋個印章條形碼,並方方正正地寫上」此箱子版權全部,仿冒必究,請到xx正品店進行專櫃驗證」,而後祈禱你的接頭人會好好地驗證這個箱子的真僞,但鑑於你和接頭人從未謀面,恐怕他也並不知道你會不會給他寄個」帶有防僞標籤的箱子」,是的,這個過程幾乎和ssl的理念同樣,每一個https的站點須要向一個可信的第三方CA(數字證書的頒發機構)申請一個證書來向每個瀏覽你網站的人證實你是你,但瀏覽你網站的人可能根本沒法意識到,你的網站是否進行過防僞了這種中間人攻擊的手段又叫SSL剝離攻擊,其原理圖一看就明白大概是如何辦到的
<ignore_js_op>
雖然不肯意認可,不過若是你的網路流量出入口真被某些居心叵測的破壞分子控制的話,你能作的就是儘可能祈禱這個傢伙的技術水平不夠到家和給你編寫APP的碼農技術到不到家了,搭建一個SSL剝離的攻擊方案也許就是一個黑wifi,一次ARP劫持和幾個腳本的事情了,實際上避免攻擊的準則除了選擇一個能夠信賴的網絡服務商,另外的更多工做須要在本身設計的代碼中去實現而不是盲目地相信某種通用的手段(固然不是說HTTPS很差用,有條件固然仍是最好用上),一個最基本的理念是,若是攻擊你的成本遠遠大於攻擊成功取得的價值成本,就可以很大程度的避免本身被一些別有用心的大佬而不是吃的太飽的大佬擺上一道,這也就是爲何咱們學習密碼學的緣由,若是你能將那些更加複雜的公鑰加密技術設計在你的通信體系中,設計的程序可以利用這些知識,去驗證收到數據的真僞(好比驗證可信CA頒發的簽名證書)那麼攻擊者就須要花費更大的代價去剝離你的驗證部分,或者根本就不可能在偶然的一次通信劫持中完成這類攻擊.
但遺憾的是在代碼通用化程度如此高的今天,儘管不少的軟件運用了完善的加密體系最大程度地保證了通信的安全,但大部分由於開發成本或者是其它的關係,開發人員並無好好的給本身充個電認爲使用現有的安全架構就可以一勞永逸去避免一堆可能帶來的問題,例如這個登陸的驗證問題,處理起來遠遠不是弄個證書整個HTTPS就可以解決的,但不管是出於開發平臺仍是出於開發成本或者是開發員的技術水平,絕大多數的網站在保證安全這塊都還有很長的路要走.
除了開發人員,最後是寫給用戶安全建議的:
請在信任的網絡中下載程序或流量網頁
若是你連入了一個不信任的網絡,請不要瀏覽不帶有效簽名的網站,
不要下載沒有有效簽名的軟件,若是你新的過這個沒有簽名的軟件,也要在信任網絡中下載
瞭解密碼安全的一些知識
最後筆者在末尾想科普一下散列函數也就是俗稱hash函數的東西,在開始科普關於hash以前,筆者首先想談談大約五六年前CSDN數據庫泄漏的事件,儘管咱們沒法猜想csdn到底出於什麼目的將用戶的密碼進行明文存儲,但這個事件無疑在圈內掀起了軒然大波,無數無辜躺槍的碼農程序猿忙着修改本身的帳戶密碼,避免被某些別有用心之徒用撞庫的手段給本身形成損失.
假若csdn不使用明文記錄用戶的密碼信息,而將這個密碼用某種不可逆的手段編碼成其它的數據,無疑此次的風波至少不會形成如此巨大的損失.
那麼說人話, hash函數究竟是什麼呢,按照百度百科的說法,
hash就是指經過散列算法,變換成固定長度的輸出,該輸出就是散列值,說的太專業了?不要緊,除法求餘數總會吧,看下面的式子
y=x%99
這是一個很簡單的求餘運算,x表示輸入的某個整數值,y表示輸出的值,顯然,無論x取多少,y的結果一定在0-99,若是你知道y的值那麼能不能求出x的值呢,很遺憾,也許你能找出不少個符合這個條件的x值,但你恐怕永遠不能肯定原始的x值是哪個了
整數求餘運算是一個很是簡單的散列運算函數或者通俗點叫hash函數,但這是一個不合格的hash函數,由於咱們能夠很是容易地經過輸出y求得多個x的可能解,而且x和y在必定的範圍內存在線性關係,而理想的hash函數,是正着算容易,倒着算難,同時輸入的輕微變更也將致使輸出極大的不一樣,
那麼這就頗有意思了,假如咱們在數據庫保存密碼時,使用適當的hash函數對其進行編碼,那麼就可以避免咱們的密碼明文被泄漏了,說到這裏,不得不提提當今鼎鼎有名的幾個hash函數,好比MD5,SHA256.
的確,當明文的密碼使用MD5或者是SHA256後想要再逆向爲明文是不大可能了,但這還不足以讓你高枕無憂,畢竟早不久才報出個大新聞MD5被破解了!,固然,被破解這種標題黨的行爲在學術上來講極爲的不許確,準確來講,是MD5被找到了一種可以快速找到碰撞的辦法,那麼碰撞是什麼呢,咱們回到以前的y=x%99,若是咱們知道y的值是1,那麼x的值是多少呢,顯然的,x的值能夠是100,能夠是199,能夠是298….,要知道若是咱們用求餘法做爲密碼的hash函數,那麼咱們輸入199,298…哪怕咱們的原始密碼是100,也會被當作是正確的密碼,也就是說,199,298是100對於該hash函數的碰撞結果.
這可就要命了,明明黑客輸入的密碼和咱們輸入的密碼不同,系統仍是將它當作了一個正確的密碼讓他登陸了,這簡直就是密碼系統的災難,既然MD5再也不安全了,那麼就放棄MD5專用SHA256吧.
然而仍是太天真了,咱們忽略了一個最基本的事實,若是明文的密碼長度不夠,那麼無論加密的手段如何的高明,咱們也能經過窮舉的方式進行破解,好比你的密碼是一個三位數數字,那麼我只須要把100-999都嘗試一遍,就能夠知道正確的結果了,也許用人腦這個辦法有點難,可是在計算機當中,完成這個窮舉連1秒都不用.
實際上確實也有人這麼幹了,他們購買了大容量的存儲設備,收集大量大經常使用明文密碼進行hash計算,同時他們創建了快速的查詢機制,只要你的密碼長度不夠或者使用了一些經常使用的密碼,那麼hash函數的對你明文密碼的保護機制將極可能再也不有效.而這種方法在網上有個比較漂亮的名字叫彩虹表
爲了不彩虹表的危機,咱們必須對密碼加一系列的約束,好比咱們能夠規定密碼的長度必定要大小寫組合的8位以上,16位如下,而後再在密碼的結尾加上一段咱們本身想出來的隨機的值增長輸入長度,以免常規計算的的彩虹表對咱們的密碼進行暴力破解的效果.
這是一種很是流行的作法,用專業的術語來講就是加鹽(salt),那段隨機的值就是咱們所說的鹽值,這個效果的確很是有效,在現在即使是已經被證實不安全的MD5在尋找碰撞仍然不是那麼的快的時候,只要這個salt足夠長,的確可以在必定程度上緩解此次的危機問題,但無論如何,咱們仍然應該摒棄那些再也不安全的hash函數而使用目前相對安全的hash函數.同時在設計通信架構時,永遠不要相信當前的密碼手段是永恆不破的,畢竟這就和明天我會不會中個億元大獎而後走向人生巔峯同樣,誰又說得清呢?
小學生坐馬桶上都看得懂的加密與通信