加密相關
凡是涉及到加密的時候,就涉及到安全,但是,在實際的開發過程中,涉及到安全部分的又比較少,有些甚至是框架給你做好了,不需要自己考慮。但是我們也還是需要去熟悉一下的。加密涉及到的東西不算難,有點雜,有些亂,每個人都會講一點,但是真的去說的時候又講不出個所以然。所以導致很多人對加密有些誤解。所以希望這篇文章對你有所幫助。
先說一下加密的概念吧,因為有些東西確實不是加密,又被大家冠以加密的頭銜,久而久之加密與非加密就特別容易混淆了。那加密的概念是什麼呢?
在 ofollow,noindex">密碼學 中, 加密 (英語:Encryption)是將 明文 資訊 改變為難以讀取的 密文 內容,使之不可讀的過程。只有擁有解密方法的物件,經由解密過程,才能將密文還原為正常可讀的內容。——維基百科
Base64
首先說一下 Base64 ,網上有人說,Base64 是加密,有人說不是。那他到底是不是呢?想回答這個問題,不難,瞭解一下 Base64 就行。
Base64 是一種使用 64 個字元來表示二進位制資料的一種編碼方式。主要作用是將二進位制資料重新編碼使其成為文字,便於傳輸。什麼意思?舉個例子。
比如需要開發一個上傳圖片的功能,但是我們沒有一個用於獨立的上傳圖片的介面,怎麼辦呢?網頁或客戶端將圖片使用 Base64 轉一下,讓它成為字串資料,然後傳送字串即可。
下表為 Base64 碼錶,圖片來自維基百科。

Base64碼錶
當然,非二進位制資料即文字資料也是可以轉換的,但是本來就是文字資料(字串)你再使用 Base64 轉換一下,幹啥呢?啥, 安全 ? 高效 ?
簡單來說 Base64 是通過將每 6 位為一個看成一個位元組,然後對映到 Base64 的碼錶中得到相應的字串。 點選這裡檢視更多關於Base64的詳細資訊 因為其轉換過程的計算方法是公開的,所以在網上你能搜到很多線上 Base64 的轉換工具,有的叫 Base64 加密、解密,有的叫 Base64 編碼、解碼。可能這也是讓大家搞混的原因之一吧,至少在我看來不是加密。只是將二進位制資料轉換成文字資料,便於傳輸。
Base64 轉換過程,參考下表:
表格來自維基百科

Base64加密方法
還有人說,使用 Base64 就不是為了安全,是因為它高效才用的。說這話的人,可能對 Base64 的編碼過程不太瞭解,我來解釋一下上面的圖片的意思,Base64 是首先將待轉換的資料在末尾以補 0 的方式將資料長度補全為 3 的倍數。然後以每 6 位作為一個位元組,不足 6 位的最高位補 0,再將其對於到碼錶中,所以,使用 Base64 只會讓資料長度變長,具體變長多少呢?1/3。既然使用 Base64 轉換後的資料都變長了,怎麼高效?
再多說一點點,仔細看,其實 Base64 不是 64 個字元,是 65 個,除了 a-z、A-Z、0-9 以及兩個特殊字元外還有一個 =
作為結束標記。但是 =
不是一定會出現的。
Hash
Hash 平時可能都有用過,但是不太熟悉,甚至,還可能覺得什麼把 Hash 跟加密放在一起?是因為 Hash 跟 Base64 一樣,也是容易被人混淆的。那麼 Hash 到底是什麼呢?Hash 在英語中有把……弄亂,切碎的意思。什麼意思呢?就是把任意長度的資料對映為固定(有限)長度的資料。比如 I'm a developer
對應的 Hash 值如下:
-
SHA1
71c25c6e21f9a1571c8aab270d8a4dee3c2a07c1
-
SHA256
0f7f321e14c9dc026f95e7569dde90dcef988ff44d30ac2dc9e24168e05111b4
-
MD5
db32e7134744e20e174c9425e627dd10
可以看到,一個字串有多個 Hash 值,這是什麼情況呢?這是因為 Hash 有多種演算法,SHA1、SHA256、MD5都是其中一種,還有其他的演算法,比如 SHA224,同時不同的演算法生成的 Hash 值的長度也不同。哎,那我同一個資料經過 Hash 之後得到的資料,變長了,或是變短了,是不是就是加密?
不好意思,還真不是,為什麼呢?因為 Hash 的演算法是不可逆的,說不可逆好像也不太合適,就是你只能使用 Hash 演算法將 I'm a developer
變成上面幾個資料中的一個,但是,你沒辦法通過 Hash 後的資料再轉換到 I'm a developer
。哇,聽起來有點雞肋啊,那他能幹啥呀。不能加密算了,還產生那麼一堆看起來沒什麼用的東西。別急啊。
因為一旦選定好 Hash 演算法之後,Hash 值就是固定的了。所以,Hash 一般用來校驗資料。比如,你在網上下載一個檔案的時候,有些下載提供商會提供幾種演算法的 Hash 值,幹啥呢。用來保證你下載的檔案確定是沒有被有心之人篡改後的。因為同樣的資料對應的 Hash 值也是一致的,即使是略微的改動也會導致 Hash 值與之前的千差萬別。比如 I'm a Developer
我只是改了其中一個字母,使用 MD5 演算法得到的 Hash 值為:
1b77d24eb81c857f2f5505ca61eda70a
你看,我只是把 d
改為 D
,它與之前的 MD5 的值就完全不一樣了。
那為什麼還有人說,MD5 快被破解了?是這樣的,因為 Hash 的被破解,不是真的說能將一個 Hash 後的字串還原到源資料,而是說找到一種演算法,通過這個演算法能找到一個與源資料不同但經過 Hash 計算之後得出的 Hash值一致的情況。
連講了兩個都不是加密的東西,再不講,加密,說不過去了。接下來開始對稱加密、非對稱加密。
對稱加密
對稱加密的原理很簡單就是加密與解密使用同一個金鑰進行。即:使用加密演算法與金鑰對原資料進行加密,使用解密演算法與金鑰對密文進行解密。哎,等等,加密演算法與解密演算法?解釋一下,解密演算法是加密演算法的反向運算。

對稱加密原型圖
你看,由於加密與解密使用的是同一個金鑰,所以安全性在一定程度上得不到保證。必須保證通訊雙方先擁有一套不被其他人知道的金鑰。不過它也是有其他有點的,比如,效能好,計算速度快,不過這個也是在犧牲金鑰長度的基礎上做的,這麼一看,好像優點不是那麼明顯……
常見的對稱加密演算法有:DES、3DES、AES、RC5、RC6。其中,DES 因為金鑰長度太短已經逐漸被棄用。
非對稱加密
剛才說了,對稱加密是不能在不安全的網路中直接傳輸金鑰的,那非對稱加密呢?它是可以在網路上進行傳輸金鑰的,因為它的金鑰是兩個。一個公鑰,一個私鑰。公鑰用於在網路上進行傳輸,私鑰留在自己手中用來解密。

非對稱加密原型
非對稱加密使用進行公鑰加密、私鑰進行解密。使用公鑰對資料進行加密得到密文,使用私鑰對密文進行解密得到資料。私鑰是能解開公鑰加密的資料,公鑰也能解開私鑰加密的資料。
因為非對稱加密中公鑰與私鑰是可以互相解開的,所以,非對稱加密還可以用於數字簽名,使用 私鑰 對原資料的 Hash 值進行加密,然後,附加在原資料的後面,這樣既保證了原資料是可讀的,又可以在資料接收完成之後對資料的完整性加以驗證。

image
非對稱加密的優點與缺點也很清晰,優點就是能在網路上進行傳輸自己的金鑰,就這一點來說,就已經比對稱加密厲害了,因為如果對稱加密把自己的金鑰放在網路上 進行傳輸,很有可能被有心之人獲取,然後做一些不可描述的事情。非對稱加密就不會存在這個問題,因為它是有兩個金鑰的。這個是優點。缺點是什麼呢?就是效能方面相對於對稱加密差一點。
常見的演算法有:RSA、ElGamal、揹包演算法、橢圓曲線加密演算法。
為什麼經過非對稱加密後的資訊在網路傳輸中是安全的
這裡引入一個場景。A、B 兩人通訊,C 作為壞人,截獲、篡改 A、B 之間的通訊內容。
先看看對稱加密後的資訊在網路傳輸中為什麼是不安全的。
首先,因為對稱加密需要雙方共同有一套金鑰,那麼金鑰是需要在網路上進行傳輸的,在這一步,就已經不安全了,因為,一旦 A、B 在網路上傳輸了金鑰,C 一定能獲取到,那麼此後的所有經過加密的內容對於 C 來說,只是需要去把加密後的資料解開即可。

image
再來看看如果使用非對稱加密該怎麼做。
首先通訊雙方會先把自己的公鑰傳送給對方,然後使用對方的公鑰對資料進行加密後傳輸。這個時候即使 C 在 A、B 交換公鑰的過程中拿到公鑰也是沒用的,因為公鑰是拿來加密的,而要解密就需要 A、B 的私鑰了。所以這個時候 C 是不能進行截獲的。這樣就絕對安全了嗎?並非如此,要知道,C 可是同時擁有 A、B 的公鑰,那只有公鑰能幹什麼呢?能偽造資料,C 雖然不能將 A、B 通訊的內容進行獲取、篡改,但是 C 能傳送一個全新的資料,然後時候公鑰進行加密呀。這樣也是能達到欺騙對方的目的。所以這還不是最終的解決方案。

image
所以最終的解決方案是,使用自己的私鑰對已經使用對方公鑰的密文再加密一次。之前使用對方的公鑰來進行加密,C 還能做到自己偽造一個假的資料,但是現在通訊需要使用私鑰再次加密了,C 連偽裝都做不到了,為什麼?因為 C 沒有任何一方的私鑰。

image
舉個例子,C 使用 B 的公鑰對偽裝資料進行加密然後傳送給 B,這時候 B 拿到資料會先用 A 的公鑰來解開(因為在規定中,是先用 B 的公鑰加密,然後再使用 A 的私鑰進行加密,在解密的時候,就需要先使用 A 的公鑰來解密,然後使用 B 的私鑰再次解密),但這時候 B 會發現,經過 A 的公鑰解密再次經過 B 的私鑰解密後資料就完全沒法看了。因為在加密的時候少了一個使用 A 的私鑰進行加密的環節。
非對稱加密有點繞,還是得自己多想想。到這裡,已經非常像 HTTPS 了,但還不是,HTTPS 比這個非對稱加密還稍微麻煩一點,敬請期待。