帶你真正的瞭解加密和Hash

lvzishen發表於2019-02-17

一.對稱加密

1.原理

通訊雙方使用 同一個金鑰,使用加密演算法配合上金鑰來加密,解密時使用加密過程的完全逆過程配合金鑰來進行解密。

2.例子

原始字元:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密碼字元:BCDEFGHIJKLMNOPQRSTUVWXYZA 原始書信:I love you 加密書信:J mpwf zpv 解讀後:I love you 這裡的 演算法就是每個字元采用後一位的字元替換,金鑰就是原始的英文字母表

3.演算法

  • DES(56 位金鑰,金鑰太短被逐漸被棄用)
  • AES(128 位、192 位、256 位金鑰,現在最流行) 金鑰長增加破解的難度和成本

4.缺點

因為加密和解密都用的相同的金鑰,如果金鑰再傳輸過程中被截獲,那麼資訊很容易就會被破解甚至偽造身份(如網路通訊過程中,A和B是兩個不認識的使用者要通訊,那麼A要把金鑰先傳給B再開始通訊,這樣B在接收金鑰的過程中可能被第三方劫持從而造成金鑰的洩露,第三方取到金鑰後便可以破解加密資訊)。

5.破解思路

拿到一組或多組原文-密文對 設法找到一個金鑰,這個金鑰可以將這些原文-密文對中的原文加密為密文,以及將密文解密為原文的組合,即為成功破解。 反破解 讓破解者找不到窮舉法(暴力破解法,可以理解為一個一個嘗試)更有效的破解手段,並 且窮舉法的破解時間足夠長(例如數千年,那麼認為不可破解)。

二.非對稱加密

1.原理

使用公鑰對資料進行加密得到密文;使用私鑰對資料進行解密得到原資料,加密解密用的演算法相同,公鑰私鑰互相是可解的(所以可以用於數字簽名技術,但雙方不能替換,因為公鑰是要暴露出去的,是可以被劫獲的)。

帶你真正的瞭解加密和Hash

2.例子

原資料:110 ---->加密演算法都是普通的加法 公鑰是加4,私鑰是加6 加密資料:554
解密資料:111110 ---->去掉每個的第一位,得出原資料110(注意:溢位是滿足非對稱加密一個很重要的條件)。

3.簽名驗證

帶你真正的瞭解加密和Hash
由於私鑰和公鑰互相可解,因此非對稱加密還可以應用於數字簽名技術(主要是為了驗證資料的來源,也就是要確定是我給你發的資料而不是別人給你發的資料,防止資料被篡改被偽造。 傳送方用自身私鑰加密,接收方獲取簽名資料後用傳送方的公鑰解密(驗證)獲取原資料,然後用獲取的原資料和傳送來的原資料比對是否一致,一致則證明資料是從目標傳送過來的。

帶你真正的瞭解加密和Hash
通常會將原資料做hash處理後再加密,降低原資料簽名後的資料大小(例如你要傳10G大小的檔案,那麼原資料10G,作為比對的簽名資料難道也要放10G嗎?不能這麼做,非常消耗流量和速度。所以直接對檔案的hash值進行簽名,最後比對hash值即可)。

為什麼簽名驗證可以證明資料的來源是安全的(也就是是我發的而不是別人偽發或偽造的)
模擬場景:
偽造方換原資料-->簽名資料驗證以後的Hash和偽造資料的Hash不相同,驗證失敗。
偽造方換原資料和簽名資料-->公鑰驗證後的資料和被換資料的Hash不符,驗證失敗。(因為簽名資料是用的換資料方自身私鑰簽名的,只有與其對應的公鑰可以還原回原Hash值,但此時用的還是原資料方的公鑰去做的驗證,所以公鑰解密後得到的並不是偽造資料的Hash值)。
綜上:資訊是沒有被偽造可能的。
複製程式碼

4.加密解密、簽名驗證的配合使用(開發中常見的使用方式)

帶你真正的瞭解加密和Hash

4.1 例子

帶你真正的瞭解加密和Hash
使用非對稱加密通訊,可以在不可信網路上將雙方的公鑰傳給對方,然後在發訊息前分別對訊息使用 對方的公鑰來加密和使用自身的私鑰來簽名,做到不可信網路上的可靠金鑰傳播及加密通訊。 A和B通訊,首先B要把自己的公鑰發給A,A用B自己的公鑰加密資料傳給B,B再用自己的私鑰解密。但是公鑰因為是暴露的,可能被C獲得,那麼C獲取B的公鑰後完全可以自己發偽造訊息給B,所以A和B通訊的時候B需要知道資訊是A傳送的,所以通訊中A會把自身的公鑰發給B,再傳送資料的時候對資料用自身的私鑰加密,因為公鑰私鑰互相可解,傳送到B後B用A的公鑰去解密,比對用B公鑰加密B私鑰解密和A私鑰加密(簽名)A公鑰解密(驗證)的資料結果是否一致,如果一致則證明是A傳送的資料而不是別人篡改過的資料。

5.優點

可以在不安全網路上傳輸金鑰,公鑰別人拿到也沒用,因為他沒有私鑰無法解資料,而私鑰又不會傳給別人只是自身持有,沒有洩露的風險 。

6.缺點

計算複雜,因此效能相比對稱加密差很多。

7.演算法

  • RSA(可用於加密和簽名)、
  • DSA(僅用於簽名,但速度更快)

8.破解思路

和對稱加密不同之處在於,非對稱加密的公鑰很容易獲得,因此製造原文-密文對是沒有困難的事 所以,非對稱加密破解的關鍵只在於,如何找到找到正確的私鑰,可以解密所有經過公鑰加密過的密文。找到這樣的私鑰即為成功破解 由於非對稱加密的自身特性,怎樣通過公鑰來推斷出私鑰通常是一種思路(例如 RSA),但往往 最佳手段依然是窮舉法,只是和對稱加密破解的區別在於,對稱加密破解是不斷嘗試自己的新金鑰是否可以將拿到的原文-密文對進行加密和解密,而非對稱加密是不斷嘗試自己 的新私鑰 是否和公鑰互相可解。

三.延伸知識: Hash

1.是什麼?

把任意資料轉換成指定大小範圍(通常很小,例如 256 位元組以內)的資料。

2.演算法

  • MD5
  • SHA256

3.作用

從資料中提出摘要資訊,因此最主要用途是數字指紋。 (也就是**根據資料的所有特徵**算出一個值)。

4.例子

public class A{

private String name;
private int age;

private void hashCode(){ //只是舉一個例子,實際中的hashCode計算要比這個複雜很多,因為要儘量減少Hash碰撞的概率.
    return name.length()+age;
}
}
複製程式碼

5.用途

唯一性驗證

例如 Java 中的 hashCode() 方法。 怎麼重寫 hashCode 方法? 把 equals() 方法中的每個用於判斷相等的變數都放進 hashCode() 中,一起生成一個儘量不會碰撞的整數即可 。 為什麼每次重寫 equals() 方法都需要? 因為你要把新的判斷條件放進 hashCode() 。 特別注意:hashCode相同不代表物件相同,因為它只是資料的特徵值,equals方法相同物件才是一樣的,但hashCode可以用於 快速檢查物件是否相同,畢竟hashCode只是一個值的比較,而equals是多個值的比較。

6.實際用途

6.1 資料完整性驗證

從網路上下載檔案後,通過比對檔案的 Hash 值(例如 MD5、SHA1),可以確認下載的檔案是否有損壞。如果下載的檔案 Hash 值和檔案提供方給出的 Hash 值一致,則證明下載的檔案是完好無損的。

6.2 快速查詢

HashMap(通過hashCode/Map的長度-1算出一個餘數,根據餘數確認在陣列中的index位置,參考HashMap原始碼)。

6.3 隱私保護

當重要資料必須暴露的時候,有時可以選擇暴露它的 Hash 值(例如 MD5),以保障原資料的安全。 例如網站登入時,可以只儲存使用者密碼的 Hash 值,在每次登入驗證時只需要將輸入的密碼的 Hash 值和資料庫中儲存的 Hash 值作比對就好,網站無需知道使用者的密碼。這樣,當網站資料失竊時,使用者不會因為自身的密碼被盜導致其他網站的安全也受到威脅(有可能設定的密碼都是相同的)。

7.Hash 是加密嗎?

不是(劃重點!!!)。Hash 是單向過程,無法進行逆向恢復操作(10G的檔案進行hash後可能hashcode只有幾KB大小,那麼這幾KB怎麼可能恢復成10G的原檔案呢),因此 Hash 不屬於加密。(MD5不是加密!!)

相關文章