天天看點

加密算法的基礎學習

加密算法主要作用是把明文變成密文,防止資訊洩露。加密後的密文看起來和亂碼很像,但卻不是亂碼。大部分亂碼是由于編碼不一緻導緻的,編碼不屬于加密算法,隻是改變了顯示格式而已。

加密算法需要保證以下三點:

1.機密性:保證資料即使被盜取,小偷也不知道是啥。

2.完整性:保證資料在傳輸過程中即使被劫持修改,接收方能夠發現資訊已被截取,而選擇換掉。

3.可用性:保證加密算法的開銷、複雜度都在可用範圍。

滿足上述要求的加密算法經曆了從古典密碼過渡到現代密碼的漫長曆史發展時期。

加密算法的曆史

最早的加密算法可以追溯到古羅馬時期,古羅馬時期是一個動蕩的時期,會經常發生戰争,加密算法就被應用到了戰争中。

在大規模的戰争中,部隊之間常常需要信使往來,傳遞重要的軍事情報。可是,一旦信使被敵軍抓獲,重要的軍事情報就完全暴露給了敵方。甚至,狡猾的敵人有可能篡改軍事情報,并收買信使把假情報傳遞給我方部隊。這樣一來,我方部隊就完全落入到了敵方的陷阱之中。這種攔截并篡改資訊的手法,在網絡安全領域被稱為中間人攻擊。怎樣防止這種情況的發生呢?不讓信使被敵人抓獲?這個肯定是無法絕對避免的。于是就産生了在情報内容上做文章的想法:就是讓敵人擷取了情報也看不懂情報的内容,這就是對情報的加密。

但是對于古羅馬時代的加密是怎麼進行實作的呢?就是選擇一個便宜量,把明文中的字母表按照偏移量向後進行偏移。進而生成密文。

如下圖所示:

加密算法的基礎學習

經過上面的處理之後,就會生成一個新的字母表,然後将資訊内容根據新的字母表進行改造就行了:

就比如說:egg ->dff,這種加密算法就被稱為凱撒密碼。凱撒密碼終歸是平移,這樣的平移的最多也就是25中順序,是以也就終歸是能夠進行試驗沒然後暴力破解的。

随着時間的發展,到二戰時期,德國在資訊傳遞過程中使用了一種叫做

恩尼格碼

的東西,來加密資訊。後來圖靈發明了圖靈機,用來使用機器對抗機器的方法,來進行破譯德國的情報。最終赢得了戰争。有部電影叫做《模仿遊戲》,主要就是講述這一段兒的故事。

再後來随着計算機的發展,資訊安全的也變得越來越重要,然後就産生了加密密碼等相關的知識内容。

加密算法的分類

在安全性要求比較高的系統中都會涉及到資料的加密、解密。按照可否進行解密來說,我們可以将加密算法分為可逆加密和不可逆加密。

不可逆加密

不可逆加密算法,特點:加密了,永遠不能解密的算法。直到宇宙的盡頭也不行。常見的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512,其中SHA-224、SHA-256、SHA-384,和SHA-512我們可以統稱為SHA2加密算法,SHA加密算法的安全性要比MD5更高,而SHA2加密算法比SHA1的要高。其中SHA後面的數字表示的是加密後的字元串長度,SHA1預設會産生一個160位的資訊摘要。

由于這些加密都是不可逆的,是以比較常用的場景就是使用者密碼加密,其驗證過程就是通過比較兩個加密後的字元串是否一樣來确認身份的。網上也有很多自稱是可以破解MD5密碼的網站,其原理也是一樣,就是有一個巨大的資源庫,存放了許多字元串及對應的MD5加密後的字元串,通過你輸入的MD5加密串來進行比較,如果過你的密碼複雜度比較低,還是有很大機率驗證出來的。

MD5加密算法

MD5資訊摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以産生出一個128位(16位元組)的散列值(hash value),用于確定資訊傳輸完整一緻。

NodeJs中隻用

MD5

算法

在NodeJs中使用

MD5

算法其實很簡單,直接使用

MD5

的一個庫。

  1. 在項目中使用

    npm install md5

    來安裝相對應的

    MD5

    的一個加密的包
  2. 然後開始使用
    const md5 = require('md5');
    
    console.log(md5('hello world'));
    
    // 運作輸出的結果為:5eb63bbbe01eeed093cb22bb8f5acdc3
               

當然這個

MD5

的庫,還具有第二個參數,即

options

。具體的使用可以參看其文檔:

https://github.com/pvorb/node-md5

還有另外的一個庫:https://github.com/brix/crypto-js,這個庫中存在有常用的多種加密的算法可供我們進行使用。

MD5

算法的使用場景

有關

MD5

算法的常用的使用場景如下:

  • 對使用者密碼進行加密
  • 請求參數進行校驗
  • 對檔案進行校驗

SHA系列算法

SHA安全雜湊演算法SHA (Secure Hash Algorithm,SHA)

是美國國家标準技術研究所釋出的國家标準FIPS PUB 180,最新的标準已經于2008年更新到FIPS PUB 180-3。其中規定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512這幾種單向雜湊演算法。SHA-1,SHA-224和SHA-256适用于長度不超過264二進制位的消息。SHA-384和SHA-512适用于長度不超過2128二進制位的消息。

HMAC加密算法

由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一種基于Hash函數和密鑰進行消息認證的方法,它可以與任何疊代散列函數捆綁使用。

HMAC運算利用hash算法,以一個消息M和一個密鑰K作為輸入,生成一個定長的消息摘要作為輸出。HMAC算法利用已有的Hash函數,關鍵問題是如何使用密鑰。

HMAC的密鑰長度可以是任意大小,如果小于n(hash輸出值的大小),那麼将會消弱算法安全的強度。建議使用長度大于n的密鑰,但是采用長度大的密鑰并不意味着增強了函數的安全性。密鑰應該是随機選取的,可以采用一種強僞随機發生器,并且密鑰需要周期性更新,這樣可以減少散列函數弱密鑰的危險性以及已經暴露密鑰所帶來的破壞。

MD5算法和SHA系列算法的特點

1、壓縮性:無論資料長度是多少,計算出來的

MD5

SHA256

值長度相同

2、容易計算性:由原資料容易計算出

MD5

SHA256

3、抗修改性:即便修改一個位元組,計算出來的

MD5

SHA256

值也會巨大差異

4、抗碰撞性:知道資料和

MD5

SHA256

值,很小機率找到相同

MD5

SHA256

值相同的原資料。

可逆加密算法

可逆加密算法相對于不可逆加密算法來講,其特點就是特點:加密了,還能夠進行解密(即還原成原來的内容)。

可逆加密算法又被分為對稱加密算法和非對稱加密算法。

對稱加密算法

對稱加密就是加密密鑰和解密秘鑰是同一個,這種加密方式應該是較容易了解,這也是一種使用比較早的加密方式。我們平時碰到的絕大多數加密就是對稱加密,比如:指紋解鎖,PIN 碼鎖,保險箱密碼鎖,賬号密碼等都是使用了對稱加密。

常見的對稱加密算法有以下三種:

  1. DES(Data Encryption Standard):資料加密标準(現在用的比較少,因為它的加密強度不夠,能夠暴力破解)
  2. 3DES:原理和DES幾乎是一樣的,隻是使用3個密鑰,對相同的資料執行三次加密,增強加密強度。(缺點:要維護3個密鑰,大大增加了維護成本)
  3. AES(Advanced Encryption Standard):進階加密标準,目前美國國家安全局使用的,蘋果的鑰匙串通路采用的就AES加密。是現在公認的最安全的加密方式,是對稱密鑰加密中最流行的算法。

對稱加密的優缺點:

  • 算法公開,計算量小,加密速度快,加密效率高
  • 雙方使用相同的鑰匙,安全性得不到保證

非對稱加密

非對稱加密有兩個密鑰:公鑰和私鑰,如果使用公鑰進行加密,那麼隻能使用私鑰才能對解密;如果使用私鑰進行加密,那麼隻能使用公鑰才能夠進行解密。因為加密秘鑰和解密秘鑰是兩個不同的秘鑰,是以,被稱為非對稱加密。

常見的非對稱加密方法有:

  • RSA加密算法
  • DSA加密算法

這種算法1978年就出現了,它是第一個既能用于資料加密也能用于數字簽名的算法。它易于了解和操作,也很流行。算法的名字以發明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。

這種加密算法的特點主要是密鑰的變化,上文我們看到DES隻有一個密鑰。相當于隻有一把鑰匙,如果這把鑰匙丢了,資料也就不安全了。RSA同時有兩把鑰匙,公鑰與私鑰。同時支援數字簽名。數字簽名的意義在于,對傳輸過來的資料進行校驗。確定資料在傳輸工程中不被修改。

有管這個RSA的加密算法是不是看上去很眼熟,沒錯,這個就是我們在給gitlab或者是github添加SSH公鑰的時候見過:

類似于下面

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMVf93CVHj8qwqRlB/rbLxSBrY
pAjeZT5cdrQoAGj5csE8wzxk2P4w7aRgDxDckUtA/YUwF9FNy9SkcwnRVJnzm9ub
OwWA/Uz1m3WRaToPcMmGz/F6r1ItqC2zpV8rwT7JibHI7acuEajnrGk/hWHR4le9
QOQGACfpeHlGJwYczwIDAQAB
-----END PUBLIC KEY-----
           

而私鑰則類似于下面的内容:

-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCMVf93CVHj8qwqRlB/rbLxSBrYpAjeZT5cdrQoAGj5csE8wzxk
2P4w7aRgDxDckUtA/YUwF9FNy9SkcwnRVJnzm9ubOwWA/Uz1m3WRaToPcMmGz/F6
r1ItqC2zpV8rwT7JibHI7acuEajnrGk/hWHR4le9QOQGACfpeHlGJwYczwIDAQAB
AoGAKAnZKxMjpA92g1EwYl0icqiJ0ElsplboZeUQHWGQkarl6vog3vzx+O+0OBvU
SbnCaLZsK36AHtwKvSh9IpYqneLyA3QL3YGVmxaMhAUtYN6B99rKk5+kH65lC2vK
35CJ8IA2/wlBn1txQdVjGu09xo4S9b7k7mMJATW59foFbHECQQDchjzrntZMj2vJ
Eb35w58febvaoUXsdu7LKxddqeDeTLorIKPETbSO/IhnVkh5DNlW3G8tpEvvNWxq
i4GDCbNbAkEAoulksIJUTkjhFoz5ZFN/djZEasdemUsH2DVTWUilqvt3JbpBt9bu
8JsojPDJiJWmwUuNW7+yEikPBWWSM7m6nQJAVFgbcNsdh8bLKOpaSO8jKzy6NtK8
FccfaiGfHDnfQecCxYAEYw59Yrr/yNZdfb8GWYySEVjnmiRKxS16aY4KRQJABIWL
2OZVJrMZJEIXbfRvVj2dWoVcF88gUZzxSkoc5wkBvpdT2aFqkl0MHBVW0qassTLC
oqhIbf6bvx+ZljvydQJAI8/FGcE04XgReuvZEDaJ6h44k5BfH7je+8LEvLBvyhwh
B4TNrwfO5UnsRuu6BwXWK+TCydr996ScrlSBsjQGhA==
-----END RSA PRIVATE KEY-----
           

DSA-Digital Signature Algorithm 是Schnorr和ElGamal簽名算法的變種,被美國NIST作為DSS(DigitalSignature Standard)。簡單的說,這是一種更進階的驗證方式,用作數字簽名。不單單隻有公鑰、私鑰,還有數字簽名。私鑰加密生成數字簽名,公鑰驗證資料及簽 名。如果資料和簽名不比對則認為驗證失敗!數字簽名的作用就是校驗資料在傳輸過程中不被修改。數字簽名,是單向加密的更新!

DSA算法和RSA算法的有什麼差別
  • 二者都是數字簽名算法中的重要組成,缺一不可;
  • DSA算法僅僅包含數字簽名算法,一般不用于加密算法中(某些擴充可以支援加密);
  • DSA算法僅産生數字證書,資訊僅能用于驗證,不适合進行加密通信,是以HTTPS不會使用這個算法;
  • RSA算法包含加解密的密鑰資訊,同時可作為數字簽名算法;

小結

有關加密算的内容遠不止我上面更新的這麼多,隻是最近研究https的時候引出了對稱加密和分對稱加密,促使我稍微深入的了解了一下加密相關的基礎内容。

至于對加密算法的研究後續應該還是會進行更加的深入的了解和學習,上面的東西僅僅隻是我對加算法的一個掃盲。

繼續閱讀