當你知道如何在應用中針對不同的使用場景使用不同的加密算法,你的應用才是安全的。因此,這篇文章將會介紹平常工作中比較常用的幾種加密方式,并給出對應的Node.js代碼。
保護密碼
用戶在注冊應用的時候難免會使用一些過于簡單的密碼,同時也傾向于在不同的站點使用相同的密碼。最可怕的是用來存儲用戶密碼的數(shù)據(jù)庫可能被黑客侵入。因此,對于用戶密碼的保護是最基礎的防護措施。(ps: 大家可以使用這個網(wǎng)站來檢查自己的密碼是否被泄露了。)
對于密碼的加密,通常使用的是哈希(hash)算法。比較常見的哈希算法有Argon2、PBKDF2、scrypt和bcrypt等。關于這些加密算法的介紹,大家可以參考Password Storage Cheat Sheet這篇文章。
node.js中提供了crypto模塊,該模塊主要用于實現(xiàn)基礎的加解密算法。接下來就來介紹一下如何使用該模塊來實現(xiàn)對于密碼的保護:
對于md5算法,這里推薦使用https://hashtoolkit/這個網(wǎng)站進行調(diào)試。普通的md5算法對于程序員來說就是明文的,因此我們一般還會對它加鹽(salt the hash):
保護存儲數(shù)據(jù)
對稱加密算法(Symmetric Encryption)是一種使用同一密鑰進行加密和解密文本的算法,這也意味著通信雙方要使用同一密鑰進行加解密。對稱加密算法對于大型數(shù)據(jù)的加密來說速度很快,因此它也主要用于存儲數(shù)據(jù)的加密。比較常用的對稱加密算法有AES、Blowfish、DES和RC4等。
crypto模塊中主要利用以下方法來實現(xiàn)對稱加密:
createCipheriv: 提供對稱加密, 該方法接收三個參數(shù),第一個是加密算法、第二個是密鑰,而第三個是初始向量(initialization vector)
update 和 final: 先更新數(shù)據(jù),然后獲得密文
同時用于對稱加密的密鑰也需要有合適的密碼管理策略進行處理,否則一旦密鑰被破解,數(shù)據(jù)的安全性就無從保障。通常我們會使用一個密鑰管理系統(tǒng)(KMS)進行管理密鑰。所有的加密密鑰都由該系統(tǒng)進行統(tǒng)一分配和管理,而用于數(shù)據(jù)加密的密鑰由一個主密鑰(master
key)進行加密。比較流行的KMS有https://cloud.google/kms/ 和 https://aws.amazon/kms/,當然你可以選擇自己實現(xiàn)。
保護通信信道
存儲數(shù)據(jù)的保護使用的是對稱算法,與之相對應的非對稱算法則主要用于保護通信信道。
在數(shù)據(jù)傳輸過程中,我們還會使用**Diffie-Hellman**算法進行交換密鑰:
接下來介紹一下HMAC算法的使用,這個算法主要用于身份認證和生成消息摘要:
雙因子認證
雙因子認證(Two-factor authentication,也叫2FA)是一種組合使用兩種不同的驗證機制來確認用戶身份的機制。主要是通過手機等設備來生成token,具體到代碼實現(xiàn)層面,可以在服務端和客戶端之間生成一個臨時的代碼序列來校驗。
這里推薦使用speakeasy這個npm庫來實現(xiàn)2FA:
總結(jié)
這篇文章主要介紹了如何在Node.js中使用crypto模塊來保護密碼、存儲數(shù)據(jù)和通信信道。最后還介紹了如何使用speakeasy模塊來實現(xiàn)雙因子驗證機制,希望這篇文章對大家有所幫助。


