1. 程式人生 > >加密 編碼簡單分析

加密 編碼簡單分析

MD5,SHA1,RSA,DSA,AES,BASE64,ENCODED,URL,Unicode,UTD-8,GBK等等這些東西,其實很多人扎眼一看會感覺非常頭疼,感覺非常難,很高大上,今天說的就是這些東西到底是什麼,看完之後應該覺得會有一種很明朗的感覺了。

 

先說加密這塊,加密跟密碼學是息息相關的,加密主要是在戰爭時期發展起來的,古時候的外國的密碼棒,中國虎符等等都屬於一種加密形式。已經包含了最基本的加密元素 加密演算法金鑰。舉個例子,如果我們寫了一種加密方法加密26個字母,a對應B,B對應C依次力推,最後一個字母對應A。這樣基本簡單加密完成了,我傳送一斷英文給對方,對方拿到後對每個字母后退一格,獲取原始字母,這樣就能拿到了。這個簡單的加密就包含了兩個關鍵元素。加密演算法就是字母+1,金鑰就是對應的加密過後的字母表。這是傳統的加密,我們現在用的加密演算法一般都是跟計算機相關的。可以對二進位制進行加密,並且非常難以破解。這裡說下破解,沒有一個加密演算法是不能破解的,只是區別於破解的難度,當破解的計算緯度非常非常大的時候可以等同於無法破解了。現在的加密演算法基本上都是 :

 

原資料(加密演算法+金鑰)  生成 密文  對方   原資料(解密演算法+金鑰)

 

這裡金鑰雙方可能一致,可能不一致 ,這個就是區分是非對稱加密 和對稱加密 。對應的最經典的演算法是RSA AES(DES金鑰太短了,很容易破解被棄用了)。看到這裡應該對加密解密有了一個很直白的瞭解了。

 

思考一個問題,網際網路的環境是很複雜的,伺服器和伺服器或者客戶端和伺服器之間進行加密通訊的情況下,如果保證雙方的金鑰一樣,很容易造成密文和金鑰的洩露,這樣的話隱私就等於全部公開了,如果之間有什麼小九九的資訊,基本就GG了。這種方式肯定是不安全的,怎麼樣才能更加安全保證我們的資訊呢?我們上面說到加密解密過程中的金鑰可以是不一樣的,這種就引出了非對稱加密。

 

非對稱加密安全程度比對稱加密高很多,但是同等的效率比對稱加密要第一點。不過這在保證安全的情況下其實都可以忽略了。對稱加密的演算法很複雜,破解難道非常大。在雙方的通訊過程中,各自都應該持有對方的一個金鑰,進行加密,收到後用自身保留的金鑰進行解密。這個工程確保了密文的安全性。雙方各自持有自身的金鑰統稱私鑰,公開出去給對方的金鑰叫公鑰。私鑰可以解公鑰,公鑰同樣能解私鑰,但是記住一點。公開出去的一定是公鑰,不能是私鑰,因為在比特幣等演算法中,公鑰是通過私鑰經過橢圓曲線演算法算出來的,如果私鑰公開很大可能,公鑰人家也知道了。在RSA的演算法中,公鑰基本都是一樣的這個哈哈,RSA算是對稱加密最簡單的演算法了。

 

理解什麼是非對稱加密我們再來看實際使用中伺服器對伺服器或者客戶端對伺服器之間的加密資料傳輸

 

              伺服器A                                                                                          伺服器B

伺服器A原文 (非對稱演算法+伺服器B的公鑰加密) 傳送給伺服器B  伺服器B得到原文(伺服器B的私鑰解密)

 

伺服器B得原文 (非對稱演算法+伺服器A的私鑰解密) 傳送給伺服器A  伺服器B得到原文(伺服器A的公鑰加密)

 

基本上就是上面的這個步驟,最簡單的流程實現。但是但是。看到上面的這個流程大家有沒有覺得哪裡不對或者有點問題?如果我是想搗亂的一方打亂你們之間的通訊,我攔截到A給B傳送的密文資訊或者B給A傳送的密文資訊,然後通過送達方的公鑰加密我想傳送的比如說低俗的語句,那麼對方收到的不就是攔截方傳送的了嗎?雖然我不知道原文是什麼,但是我能給你搗亂,讓你不知道對方到底給你傳送的是什麼訊息,這樣一樣能達到一些目地。從這裡就要需要驗證傳送方的身份資訊了。怎麼樣驗證呢?接下來引出簽名的概念

 

什麼是簽名?簽名的大體意思就是私鑰加密一斷資訊傳送給地方,然後用自己的公鑰介面出原文。這個私鑰加密的內容就是簽名。私鑰是非公開的,只要本身持有,通過私鑰可以確保對方就是對方,你就是你。所以在我們實際使用中,非對稱加密的傳輸為了確保安全肯定會攜帶上簽名資訊的整體邏輯應該修改成下面的樣子

 

伺服器A 原文 通過伺服器B的公鑰加密生成密文+伺服器A對加密的資料HASH後用A的私鑰加密生成簽名一起打包傳送給伺服器B  伺服器B拿到資訊後私鑰解密加密資訊用HASH得到HASH後,比對簽名,對比如果一樣說明這個訊息是可靠安全的

 

基本的加密邏輯就是這樣。懂了這個原理再下篇文章中會說到HTTPS的原理,再看HTTPS就容易理解了,這個是後話了。常用的加密邏輯基本就是這樣。

 

接下來我們說下 同加密感覺很像的編碼 其實這兩個是完全不一樣的東西

最常用的編碼大家都應用知道  Base64編碼 把任何的二進位制流轉換成文字資訊傳輸。

使用場景是什麼呢?比如說客戶端傳圖片給後臺,後臺需要你這邊把圖片流轉換成base64編碼POST給他。這個是很多伺服器的做法。再比如一些資訊,需要轉換成字串傳送,這個可以放在URL裡面方便傳輸。還有一個直觀的好處base64編碼後明眼人是看不出來是什麼的。達到一個心理上的加密的意思,但是這個根本不是加密,拿到編碼直接轉就能得到原資料了,很多人概念不清晰就說base64加密一下,這個說法其實是不對的。

base64的缺點:會把原資料變大,基本會變大1/3,導致頻寬增大,讀取資源的損耗增大,所以對速度要求很高,不要用這個編碼

base64變種 base58去掉了一些比較容易相互混淆的字母。比如0和O,用在比特幣相關的地方

 

其餘的常用的編碼有urlencoding在網頁連結使用中把中文和特殊符號進行轉碼,讓瀏覽器識別 。壓縮 JPEG  MP3等等。

 

關注點還是關注加密解密更實用。

 

 

 

 

結語:感謝hencoder 感謝扔物線凱哥