前後端數據傳輸安全——加密淺析 加密

加密

本文內容:

  • 密碼學起源
  • 古典密碼學
  • 現代密碼學
  • 對稱加密
  • 非對稱加密
  • 數字簽名
  • 哈希

密碼學起源:

在戰爭中需要傳遞信息,所以有了密碼學。

隱寫術:

在奴隸的頭皮上刻字,用頭髮遮擋;在身上隱私部位刻字。

武俠小說中武功祕籍是空白的,沾水顯出字。

古典密碼學:

移位式加密:密碼棒。

加密算法:纏繞木棒後書寫。

密鑰:木棒的尺寸規格。

替換式加密:

字母表、碼錶。

加密:使用碼錶替換字母表中對應字母。

解密:使用字母表中的字母替換碼錶中對應字母。

現代密碼學:

隨着計算機的發展,數學算法多次計算。不止可以用於文字內容,還可以用於各種二進制數據。按照加解密使用的密鑰是否相同,可分爲對稱加密和非對稱加密。

對稱加密:

使用密鑰和加密算法對數據進行轉換,得到的無意義數據即爲密文,使用同一密鑰和解密算法進行逆向轉換,得到原數據。

加密算法:DES、AES。

DES 密鑰位數只有 64 位,已經被棄用。主流 AES 128 位。

舉個抽象的栗子:

// 原數據是111
// 加密算法是各項加法
// 解密算法是各項減法
// 密鑰是4
111 加密: 1+4,1+4,1+4 = 555
對密文555 解密:5-4,5-4,5-4=111

非對稱加密:

使用公鑰對數據加密得到密文,使用私鑰對數據解密得到原數據。

加密算法:RSA、DSA、橢圓曲線等

下圖中的加密密鑰就是公鑰,發送給客戶端,讓客戶端加密數據,解密密鑰就是私鑰,自己持有,用來解密客戶端加密過的數據。

// 原數據是111
// 加密算法是各項加法
// 加密密鑰是4
// 解密密鑰是6,去除十進制進位後的十位。
111 加密: 1+4,1+4,1+4 = 555
對密文555 解密:5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,結果是111

對稱加密的優缺點:

算法簡單,速度快,適合加密大數據。

缺點:在不安全的網絡中,密鑰傳輸過程容易被截獲。

舉個栗子:

網絡通信是不安全的,小明對小紅髮消息,使用對稱加密,小明把密鑰發給小紅的過程中,被法外狂徒張三攔截到了公鑰,小明對小紅說我家密碼是 123456,加密後的密文是aoeqpe,張三攔截後使用公鑰解密,知道了小明家的密碼,小明沒有等到小紅,等到了張三。。。

上面可能有疑問,張三也不知道算法,怎麼能破解,其實算法最簡單最暴力的破解方法就是窮舉法,一個一個試,在計算機發達的時代,簡單算法容易被破解。

非對稱加密的優缺點:

缺點:速度較慢

優點:安全

上圖中,張三攔截到了小明發給小紅的公鑰,小明給小紅髮信息我愛你加密後是asbd,張三攔截到,並沒有解密密鑰,所以不能破解。

上面的例子是單向通信的,要實現雙向通信,小明也需要一對密鑰,私鑰自己保存,公鑰發佈給小紅。這樣小紅使用小明的公鑰也能安全的給小明發信息了。

非對稱一定安全嗎?

上圖中,張三攔截到小明的消息並不能解密,但是他用公鑰加密了分手吧發給小紅,小紅收到後傷心欲絕跳樓了。這就是僞造攻擊。

數字簽名:

爲了防止僞造,就需要在數據上附帶數字簽名,保證數據來源的合法性。

公鑰能不能解密私鑰加密的數據?

還記得上面非對稱加密的例子嗎:

// 原數據是111
// 加密算法是各項加法
// 公鑰是4
// 私鑰是6,去除十進制進位後的十位。
原數據111 公鑰加密: 1+4,1+4,1+4 = 555
密文555 私鑰解密:5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,結果是111

現在我們使用數字簽名的方法重寫上面的例子,把加密後的密文當做原數據:

// 原數據是111
// 加密算法是各項加法
// 公鑰是4
// 私鑰是6,去除十進制進位後的十位。
原數據111 公鑰加密: 1+4,1+4,1+4 = 555
密文555 私鑰解密:5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,結果是111

// 數字簽名

// 原數據是555
// 加密算法是各項加法
// 公鑰是4
// 私鑰是6,去除十進制進位後的十位。
原數據555 私鑰加密: 5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,結果是111
對密文111 公鑰解密:1+4,1+4,1+4 = 555

公鑰可以解密私鑰加密的數據

通常我們使用公鑰加密,用私鑰解密。而在數字簽名中,我們使用私鑰加密(相當於生成簽名),公鑰解密(相當於驗證簽名)。

我們可以直接對消息進行簽名(即使用私鑰加密,此時加密的目的是爲了簽名,而不是保密),驗證者用公鑰正確解密消息,如果和原消息一致,則驗證簽名成功,證明是對方發來的消息。但通常我們會對消息的散列值簽名,因爲通常散列值的長度遠小於消息原文,使得簽名(非對稱加密)的效率大大提高。注意,計算消息的散列值不是數字簽名的必要步驟。

在實際使用中,我們既想加密消息,又想簽名,所以要對加密和簽名組合使用,比如TLS就組合了加密和簽名。

數字簽名的使用:

上圖的用法是有漏洞的,如果另一個人攔截了發送方的公鑰,就能通過數字簽名解密出原數據,數據就被竊聽了,並且因爲通信中含有2份數據,數據包增大。所以在實際操作中會使用 hash 算法,對原數據摘要進行簽名,接收方對解密的數據也進行 hash,把摘要信息和解密的簽名數據對比,確定是對方發送的原數據。

現在,通過 hash,數據量很小,並且可以驗證數據來源,但是還有一種攻擊,就是重放攻擊,需要進一步設計才能抵擋。

舉個栗子:

小明給銀行發送存一千塊錢的請求。張三攔截到原數據,張三並不能解開,但是可以一直給銀行發。本來小明存一千塊,結果銀行收到10次,小明存了一萬塊。這就是重放攻擊。爲了防止這種攻擊,我們要在數據裏利用時間戳、唯一序號等計算出一個請求籤名。這樣就避免重複消息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章