前言
加密解密是前后端開發(fā)經(jīng)常需要使用到的技術(shù),應(yīng)用場(chǎng)景包括不限于用戶鑒權(quán)、數(shù)據(jù)傳輸?shù)?,不同的?yīng)用場(chǎng)景也會(huì)需要使用到不同的簽名加密算法,或者需要搭配不一樣的簽名加密算法來(lái)達(dá)到業(yè)務(wù)目標(biāo)。所以了解加解密,以及常用的加解密函數(shù)庫(kù),可以根據(jù)不同的業(yè)務(wù)場(chǎng)景,選擇適合當(dāng)下業(yè)務(wù)場(chǎng)景的加解密函數(shù)庫(kù)。
安全性威脅
這里借用 workPlus 對(duì)于安全性威脅概括,進(jìn)行說(shuō)明:
第一,中斷
攻擊者有意破壞和切斷他人在網(wǎng)絡(luò)上的通信,這是對(duì)可用性的攻擊。
第二,截獲
屬于被動(dòng)攻擊,攻擊者從網(wǎng)絡(luò)上竊聽他人的通信內(nèi)容,破壞信息的機(jī)密性。
第三,篡改
攻擊者故意篡改網(wǎng)絡(luò)上傳送的報(bào)文,這是對(duì)完整性的攻擊。
第四,偽造
攻擊者偽造信息在網(wǎng)絡(luò)傳送,這是對(duì)真實(shí)性的攻擊。

加密的意義
-
數(shù)據(jù)加密
a. 敏感數(shù)據(jù)的加密 :敏感數(shù)據(jù)進(jìn)行完整性校驗(yàn)和加密存儲(chǔ), 有效防止敏感數(shù)據(jù)被竊取,篡改,權(quán)限被非法獲取;
b. 金融支付保護(hù):保證支付數(shù)據(jù)在傳輸和存儲(chǔ)過(guò)程中的完整性、保密性和支付身份的認(rèn)證、支付過(guò)程的不可否認(rèn)性;
c. 電子票據(jù)驗(yàn)偽:保證電子合同、電子發(fā)票、電子保單、電子病歷在傳輸、存儲(chǔ)過(guò)程中的保密性和完整性;
d. 視頻監(jiān)控安全:保證視頻、人臉、車輛、軌跡等隱私信息,以及個(gè)人數(shù)據(jù)在存儲(chǔ)過(guò)程中的保密性,防止數(shù)據(jù)泄露;
-
信息安全:
a. 撞庫(kù)操作:是指收集已經(jīng)在互聯(lián)網(wǎng)上泄漏的用戶和密碼信息, 生成對(duì)應(yīng)的字典表,并嘗試批量登錄其他網(wǎng)站,然后得到一系列可以登錄的用戶, 撞庫(kù)的原因是由于信息泄漏, 而且泄漏的數(shù)據(jù)沒(méi)有加密或者加密的方式比較弱,這樣可以獲得到原來(lái)的用戶和密碼;
加解密的分類
-
對(duì)稱加密
a. 定義: 對(duì)稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法。有時(shí)又叫傳統(tǒng)密碼算法,就是加密密鑰能夠從解密密鑰中推算出來(lái),同時(shí)解密密鑰也可以從加密密鑰中推算出來(lái)。而在大多數(shù)的對(duì)稱算法中,加密密鑰和解密密鑰是相同的,所以也稱這種加密算法為秘密密鑰算法或單密鑰算法。它要求發(fā)送方和接收方在安全通信之前,商定一個(gè)密鑰。對(duì)稱算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都可以對(duì)他們發(fā)送或接收的消息解密,所以密鑰的保密性對(duì)通信的安全性至關(guān)重要。
b. 特點(diǎn):對(duì)稱加密算法的特點(diǎn)是算法公開、計(jì)算量小、加密速度快、加密效率高。
c. 不足:秘鑰的管理和分發(fā)非常困難,不夠安全。在數(shù)據(jù)傳送前,發(fā)送方和接收方必須商定好秘鑰,然后雙方都必須要保存好秘鑰,如果一方的秘鑰被泄露,那么加密信息也就不安全了。另外,每對(duì)用戶每次使用對(duì)稱加密算法時(shí),都需要使用其他人不知道的唯一秘鑰,這會(huì)使得收、發(fā)雙方所擁有的鑰匙數(shù)量巨大,密鑰管理成為雙方的負(fù)擔(dān)。
d. 具體算法: DES,AES,3DES,凱撒加密算法等。
file -
非對(duì)稱加密
a. 定義: 非對(duì)稱加密算法需要兩個(gè)密鑰:公開密鑰(publickey: 簡(jiǎn)稱公鑰)和私有密鑰(privatekey: 簡(jiǎn)稱私鑰)。公鑰與私鑰是一對(duì),如果用公鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私鑰才能解密。
b. 流程: 甲方生成一對(duì)密鑰并將公鑰公開,需要向甲方發(fā)送信息的其他角色(乙方)使用該密鑰(甲方的公鑰)對(duì)機(jī)密信息進(jìn)行加密后再發(fā)送給甲方;甲方再用自己私鑰對(duì)加密后的信息進(jìn)行解密。甲方想要回復(fù)乙方時(shí)正好相反,使用乙方的公鑰對(duì)數(shù)據(jù)進(jìn)行加密,同理,乙方使用自己的私鑰來(lái)進(jìn)行解密。
c. 特點(diǎn): 算法強(qiáng)度復(fù)雜、安全性依賴于算法與密鑰但是由于其算法復(fù)雜,而使得加密解密速度沒(méi)有對(duì)稱加密解密的速度快。
d. 不足 :非對(duì)稱加密算法比對(duì)稱加密算法慢數(shù)千倍。
e. 具體算法: RSA, RSA可以通過(guò)認(rèn)證來(lái)防止中間人攻擊, ECC(橢圓曲線加密算法)。
file -
混合加密
a. 流程: 服務(wù)器用明文的方式給客戶端發(fā)送自己的公鑰,客戶端收到公鑰之后,會(huì)生成一把密鑰(對(duì)稱加密用的),然后用服務(wù)器的公鑰對(duì)這把密鑰進(jìn)行加密,之后再把密鑰傳輸給服務(wù)器,服務(wù)器收到之后進(jìn)行解密,最后服務(wù)器就可以安全著得到這把密鑰了,而客戶端也有同樣一把密鑰,他們就可以進(jìn)行對(duì)稱加密了。
b. 特點(diǎn): 混合加密則采取兩家之長(zhǎng),即解決了秘鑰的安全配送問(wèn)題,同時(shí)也提高了加密與解密效率。
file -
數(shù)字簽名
a. 流程:發(fā)送報(bào)文時(shí),發(fā)送方用一個(gè)哈希函數(shù)從報(bào)文文本中生成報(bào)文摘要,然后用發(fā)送方的私鑰對(duì)這個(gè)摘要進(jìn)行加密,這個(gè)加密后的摘要將作為報(bào)文的數(shù)字簽名和報(bào)文一起發(fā)送給接收方,接收方首先用與發(fā)送方一樣的哈希函數(shù)從接收到的原始報(bào)文中計(jì)算出報(bào)文摘要,接著再公鑰來(lái)對(duì)報(bào)文附加的數(shù)字簽名進(jìn)行解密,如果這兩個(gè)摘要相同、那么接收方就能確認(rèn)該報(bào)文是發(fā)送方的。
b. 數(shù)字簽名有兩種功效:一是能確定消息確實(shí)是由發(fā)送方簽名并發(fā)出來(lái)的,因?yàn)閯e人假冒不了發(fā)送方的簽名。二是數(shù)字簽名能確定消息的完整性。因?yàn)閿?shù)字簽名的特點(diǎn)是它代表了文件的特征,文件如果發(fā)生改變,數(shù)字摘要的值也將發(fā)生變化。不同的文件將得到不同的數(shù)字摘要。 一次數(shù)字簽名涉及到一個(gè)哈希函數(shù)、接收者的公鑰、發(fā)送方的私鑰。
file 數(shù)字證書(或簡(jiǎn)稱證書):是在 Internet 上唯一地標(biāo)識(shí)人員和資源的電子文件。證書使兩個(gè)實(shí)體之間能夠進(jìn)行安全、保密的通信。


加解密的應(yīng)用場(chǎng)景
目前業(yè)務(wù)中使用的是sm2進(jìn)行加解密
國(guó)密即國(guó)家密碼局認(rèn)定的國(guó)產(chǎn)密碼算法。主要有SM1,SM2,SM3,SM4。密鑰長(zhǎng)度和分組長(zhǎng)度均為128位。
1:SM1 為對(duì)稱加密。其加密強(qiáng)度與AES相當(dāng)。該算法不公開,調(diào)用該算法時(shí),需要通過(guò)加密芯片的接口進(jìn)行調(diào)用。
2:SM2為非對(duì)稱加密,基于ECC。該算法已公開。由于該算法基于ECC,故其簽名速度與秘鑰生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一種)安全強(qiáng)度比RSA 2048位高,但運(yùn)算速度快于RSA。
3:SM3 消息摘要??梢杂肕D5作為對(duì)比理解。該算法已公開。校驗(yàn)結(jié)果為256位。
4:SM4 無(wú)線局域網(wǎng)標(biāo)準(zhǔn)的分組數(shù)據(jù)算法。對(duì)稱加密,密鑰長(zhǎng)度和分組長(zhǎng)度均為128位。
const sm2 = require('sm-crypto').sm2; // uic中
// 控制臺(tái)中的加密解密應(yīng)用
import { SM2 } from 'gm-crypto';
// sm2加密
export function encryptSM(str, key) {
const result = SM2.encrypt(str, key, {
inputEncoding: 'utf8',
outputEncoding: 'hex', // 支持 hex/base64 等格式
});
// 04 表示非壓縮
return '04' + result;
}
// sm2解密
export function decryptSM(str, key) {
return SM2.decrypt(str, key, {
inputEncoding: 'hex',
outputEncoding: 'utf8', // 支持 hex/base64 等格式
});
}
思考
- 非對(duì)稱加密中公私鑰都可以加密,那么什么時(shí)候用公鑰加密,什么時(shí)候用私鑰“加密” ?
- 什么是數(shù)字簽名,數(shù)字簽名的作用是什么?
- 為什么要對(duì)數(shù)據(jù)的摘要進(jìn)行簽名,而不是直接計(jì)算原始數(shù)據(jù)的數(shù)字簽名?
- 什么是數(shù)字證書,數(shù)字證書解決了什么問(wèn)題?
- 前端進(jìn)行加密到底有沒(méi)有用?
前端加密不是決定性的保護(hù)措施,但卻是一種有意義的低成本安全增強(qiáng)方案。



