密碼學 與 Node.js

白色風車發表於2016-12-28

Cryptography & Nodejs

掃盲

Cryptography is the art and science of making a cryptosystem that is capable of providing information security.

密碼學(Cryptography)是研究如何通過一系列相關技術手段構建一套加密系統確保系統的資訊保安。

資訊保安的目標

私密性(Confidentiality)

資料完整性(data integrity)

身份可驗證(authentication)

不可否認性(non-repudiation)

常見手段

加密(Encryption)

為了保證訊息明文不被截獲,常採取傳遞加密訊息的手段。大致流程如下圖,

密碼學 與 Node.js

加密通常需要向加密演算法提供訊息明文和加密祕鑰,加密方式常分為對稱加密和非對稱加密。

對稱加密的祕鑰只有一個,訊息傳送接收方各自擁有同一個加密祕鑰用來加解密。常見演算法有:DES、AES等。

非對稱加密的祕鑰有兩個,加解密需要同時配合兩個祕鑰進行,在通訊過程中,雙方各自向對方提供自己的加密公鑰,在向對方發訊息時使用對方的加密公鑰進行加密,而對方發過來的訊息則可以通過自己的祕鑰對進行解密。常見的機制有:RSA 、ElGamal等。

雜湊(Hash functions)

密碼學 與 Node.js

如圖示,雜湊是指把原訊息文雜湊壓縮演算法轉換成固定長度的字串。所選擇的演算法生成的字串和原文內容唯一對應,不會有兩個不同的原文輸入生成出一樣的字串,因此可以用來確保原文內容的完整性。除此以外,hash之後的結果通常無法還原成輸入的原文,即hash一般是不可逆的。

常見演算法有MD、SHA等。

訊息身份驗證碼(Message Authentication codes (MAC))

密碼學 與 Node.js

如圖示,訊息身份驗證用於驗證發訊息的來源合法,和驗證訊息原文沒被修改類似,通過訊息身份驗證碼演算法接收身份key和原文計算驗證碼,傳輸後在接收方再一次進行計算然後比較一致性。

數字簽名(Digital Signatures)

密碼學 與 Node.js

如圖示,數字簽名比訊息身份驗證更進一步,結合原始訊息文字的hash值和祕鑰對計算驗證碼進行驗證。

手段和目標之間的關係:

密碼學 與 Node.js

所以如圖示,如果要設計出一個滿足上述各種安全性目標的系統,需要結合其中的多種手段來實現。 例如,加密原始訊息內容之後再應用數字簽名機制傳遞訊息。

參考文章:Cryptography - Quick Guide


Crypto in nodejs

nodejs中的密碼相關的功能都在crypto這個模組中。

使用時需要引入該模組var crypto = require('crypto');

根據上述的密碼相關手段,可以對應到crypto模組中的相應方法

官方文件有各方法的詳細說明和示例程式碼,這裡只說明一下這些方法使用的場景。

加密解密

使用crypto.createCipher[vi]crypto.createDecipher[vi].

祕鑰管理

使用crypto.createDiffieHellman,crypto.createECDH等。

雜湊運算

使用crypto.createHash

訊息驗證碼運算

使用crypto.createHmac

數字簽名

使用crypto.createSigncrypto.createVerify


相關文章