寫在前面的話
騰訊大佬問的,被問到了,當(dāng)時(shí)好尷尬...
(一)對稱性加密
1、MD5加密(無解密方法,解密不可逆)
適用場景:
用戶注冊完成后,將加密后的密碼發(fā)送給后端,后端將加密后的密碼存儲在數(shù)據(jù)庫中,當(dāng)用戶登錄時(shí),前端依然發(fā)送加密后的密碼,后臺對比數(shù)據(jù)庫中存儲的密碼和前端發(fā)送的密碼。
2、AES加解密
適用場景:
網(wǎng)站注冊時(shí),如果注冊過程分兩步進(jìn)行,第一步校驗(yàn)手機(jī)號,校驗(yàn)通過后,跳轉(zhuǎn)到其他界面,填寫其他注冊信息,完成注冊。如果第三方通過偽造返回信息,可以欺騙前端,非法注冊如果要解決非法注冊的問題,那么需要前后端雙重校驗(yàn),前后端都需要涉及到加密和解密,所以可以使用AES加解密。
高級加密標(biāo)準(zhǔn)(Advanced Encryption Standard)為最常見的對稱加密算法
(微信小程序加密傳輸就是用這個(gè)加密算法的)
特點(diǎn)
優(yōu)點(diǎn):算法公開、計(jì)算量小、加密速度快、加密效率高。
缺點(diǎn):在數(shù)據(jù)傳送前,發(fā)送方和接收方必須商定好密鑰,然后雙方保存好密鑰。如果一方的密鑰被泄露,那么加密信息也就不安全了
使用場景:本地?cái)?shù)據(jù)加密、https 通信、網(wǎng)絡(luò)傳輸?shù)?/p>

密鑰:用來加密明文的密碼。密鑰為接收方與發(fā)送方協(xié)商產(chǎn)生,但不可以直接在網(wǎng)絡(luò)上傳輸,否則會導(dǎo)致密鑰泄漏,通常是通過非對稱加密算法加密密鑰,然后再通過網(wǎng)絡(luò)傳輸給對方,或者直接面對面商量密鑰。密鑰是絕對不可以泄漏的,否則會被攻擊者還原密文,竊取數(shù)據(jù)。
varCryptojs=require('crypto-js');vardata = { id:1, text:'Hello World'};
// 加密生成密文
varciphertext = Cryptojs.AES.encrypt(jsON.stringify(data),'secret_key_123').toString();
// 解密得到明文
varbytes = Cryptojs.AES.decrypt(ciphertext,'secret_key_123');
vardecryptedData =jsON.parse(bytes.toString(Cryptojs.enc.Utf8));
(二)非對稱加密算法
非對稱加密算法需要兩個(gè)密鑰:公開密鑰(publickey:簡稱公鑰)和私有密鑰(privatekey:簡稱私鑰)。公鑰與私鑰是一對,如果用公鑰對數(shù)據(jù)進(jìn)行加密,只有用對應(yīng)的私鑰才能解密。因?yàn)榧用芎徒饷苁褂玫氖莾蓚€(gè)不同的密鑰,所以這種算法叫作非對稱加密算法。
優(yōu)點(diǎn):非對稱加密與對稱加密相比其安全性更好
缺點(diǎn):加密和解密花費(fèi)時(shí)間長、速度慢,只適合對少量數(shù)據(jù)進(jìn)行加密。
使用場景:https 會話前期、CA 數(shù)字證書、信息加密、登錄認(rèn)證等;
1、RSA

2、Hash 算法
Hash,一般翻譯做“散列”,也有直接音譯為“哈?!钡?,就是把任意長度的輸入(又叫做預(yù)映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。
簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)。
優(yōu)點(diǎn):不可逆、易計(jì)算、特征化
缺點(diǎn):可能存在散列沖突
使用場景:文件或字符串一致性校驗(yàn)、數(shù)字簽名、鑒權(quán)協(xié)議
3、sha1加密
(三)其他
1、Base64 編碼
Base64 編碼只是一種編碼格式并不是加密算法,它可用于在 HTTP 環(huán)境下傳遞較長的標(biāo)識信息。
特點(diǎn)
可以將任意的二進(jìn)制數(shù)據(jù)進(jìn)行 Base64 編碼
數(shù)據(jù)加密之后,數(shù)據(jù)量會變大,變大 1/3 左右
編碼后有個(gè)非常顯著的特點(diǎn),末尾有個(gè)=號
可進(jìn)行反向解碼,Base64 編碼具有不可讀性
現(xiàn)代瀏覽器都提供了 Base64 編碼、解碼方法,btoa() 和 atob()
var enc = window.btoa('Hello World');
// SGVsbG8gV29ybGQ=
var str = window.atob(enc);
// Hello World
應(yīng)用
在業(yè)務(wù) http 請求中,AES 的密鑰在前端隨機(jī)生成,從服務(wù)器獲取 RSA 的公鑰,對 AES 的密鑰進(jìn)行非對稱加密,把加密后的密鑰在請求頭中傳給服務(wù)器,用 AES 對 body 進(jìn)行加密。服務(wù)器收到請求頭中的加密后的密鑰,用 RSA 的密鑰進(jìn)行解密,得到明文的 AES 密鑰,即可對 body 進(jìn)行解密。md5 有校驗(yàn)字符串一致性的特性,為避免請求被攔截后篡改 body,可在發(fā)請求時(shí),將 body 字符串進(jìn)行一個(gè) md5 加密后在請求頭傳輸,服務(wù)器收到請求后,解密 body 后再 md5 與請求頭的進(jìn)行校驗(yàn),可驗(yàn)證是否請求被篡改。
參考鏈接:
https://www.cnblogs.com/wxb1314/p/13264451.html