網(wǎng)站推廣的措施和手段有哪些新塘網(wǎng)站seo優(yōu)化
本文主要詳細(xì)介紹了在前端開(kāi)發(fā)中常用的加/解密算法,以及前端如何實(shí)現(xiàn)。
總的來(lái)說(shuō):前端加密無(wú)論使用哪個(gè)加密都一樣是有可能性被他人獲取到相關(guān)的公鑰或密鑰的(比如:攔截請(qǐng)求、查看源代碼等),然后進(jìn)行加密與后端通訊,所以前端加密所謂的安全性是有限的,最主要的還是在后端!
一、加密算法
1、對(duì)稱加密
含義: 加密和解密使用的是相同的秘鑰,加密快而且方便,但缺點(diǎn)是密鑰容易被偷或被破解。
常見(jiàn)算法: AES、DES、3DES 、RC2、RC4、RC5、RC6 、 Blowfish、國(guó)密SM4。
常見(jiàn)應(yīng)用場(chǎng)景:
- 適用于需要高速加密/解密的場(chǎng)景,如:HTTP 傳輸?shù)?SSL/TLS 部分。
- 適用于加密大量數(shù)據(jù),如:文件加密、網(wǎng)絡(luò)通信加密、數(shù)據(jù)加密、電子郵件、Web 聊天等。
2、非對(duì)稱加密
含義: 加密和解密用的不是同一個(gè)秘鑰,一般是用公鑰加密,用私鑰解密,公鑰和私鑰成對(duì)存在,公鑰從私鑰中提取產(chǎn)生公開(kāi)給所有人。安全性要好于對(duì)稱加密的,但性能就比較差。
常見(jiàn)算法: RSA、DSA、Elgamal、DSS、Merkle-Hellman背包算法、D-H、ECC(橢圓曲線加密算法)、國(guó)家商用密碼SM2算法。
常見(jiàn)應(yīng)用場(chǎng)景:
在實(shí)際應(yīng)用中,非對(duì)稱加密通常用于需要確保數(shù)據(jù)完整性和安全性的場(chǎng)合,如:數(shù)字證書(shū)的頒發(fā)、SSL/TLS 協(xié)議的加密、數(shù)字簽名、加密小文件、密鑰交換、實(shí)現(xiàn)安全的遠(yuǎn)程通信等。
3、單向散列函數(shù)
含義: 又稱為消息摘要算法,是不可逆的加密算法,即對(duì)明文進(jìn)行加密后,無(wú)法通過(guò)得到的密文還原回去得到明文。
常見(jiàn)的單項(xiàng)散列函數(shù): MD5、SHA1、SHA256、SHA512 ,以及它們之前加上 Hmac(Keyed-hash message authentication codes) 后的 HmacMD5、HmacSHA1 等。
二、經(jīng)典的加密算法
1、對(duì)稱加密算法 —— AES(Advanced Encryption Standard)
英文全稱為 Advanced Encryption Standard
,即高級(jí)加密標(biāo)準(zhǔn)的意思。
AES的推出,用于取代已經(jīng)被證明不安全的 DES 算法。
AES 屬于分組加密算法,因?yàn)樗鼤?huì)把傳入的明文數(shù)據(jù)以 128 bit 為一組分別處理。
其秘鑰長(zhǎng)度則可以是 128、192 和 256 bit。
AES 或者說(shuō)對(duì)稱加密算法的優(yōu)點(diǎn)是速度快,缺點(diǎn)就是不安全,因?yàn)榫W(wǎng)站上的代碼和秘鑰都是明文,別人只要得到了加密結(jié)果再結(jié)合秘鑰就能得到加密的數(shù)據(jù)了。
AES與DES
DES
優(yōu)點(diǎn):DES算法具有極高安全性,到目前為止,除了用窮舉搜索法對(duì)DES算法進(jìn)行攻擊外,還沒(méi)有發(fā)現(xiàn)更有效的辦法。
缺點(diǎn):分組比較短、密鑰太短、密碼生命周期短、運(yùn)算速度較慢。
AES
優(yōu)點(diǎn):運(yùn)算速度快,對(duì)內(nèi)存的需求非常低,適合于受限環(huán)境。分組長(zhǎng)度和密鑰長(zhǎng)度設(shè)計(jì)靈活, AES標(biāo)準(zhǔn)支持可變分組長(zhǎng)度;具有很好的抵抗差分密碼分析及線性密碼分析的能力。
缺點(diǎn):目前尚未存在對(duì)AES 算法完整版的成功攻擊,但已經(jīng)提出對(duì)其簡(jiǎn)化算法的攻擊。
AES與DES之間的主要區(qū)別 在于加密過(guò)程:在DES中,將明文分為兩半,然后再進(jìn)行進(jìn)一步處理;而在AES中,整個(gè)塊不進(jìn)行除法,整個(gè)塊一起處理以生成密文。
相對(duì)而言,AES比DES快得多,與DES相比,AES能夠在幾秒鐘內(nèi)加密大型文件。
2、非對(duì)稱加密—— RSA算法
RSA加密算法是一種非對(duì)稱加密算法,使用"一對(duì)"密鑰,分別是公鑰和私鑰,這個(gè)公鑰和私鑰其實(shí)就是一組數(shù)字,其二進(jìn)制位長(zhǎng)度可以是1024位或者2048位,長(zhǎng)度越長(zhǎng)其加密強(qiáng)度越大。
目前為止公之于眾的能破解的最大長(zhǎng)度為795位密鑰,只要高于795位,相對(duì)就比較安全,所以目前為止這種加密算法一直被廣泛使用。
由于RSA算法的原理都是大數(shù)計(jì)算,使得RSA最快的情況也比對(duì)稱加密算法慢上好幾倍。
RSA的速度是對(duì)應(yīng)同樣安全級(jí)別的對(duì)稱加密算法的1/1000左右。
常見(jiàn)場(chǎng)景:
速度一直是RSA的缺陷,一般來(lái)說(shuō)RSA只用于小數(shù)據(jù)的加密,比如對(duì)稱加密算法的密鑰,又或者數(shù)字簽名。例如:在用戶注冊(cè)或登錄的時(shí)候,用公鑰對(duì)密碼進(jìn)行加密,再去傳給后臺(tái),后臺(tái)用私鑰對(duì)加密的內(nèi)容進(jìn)行解密,然后進(jìn)行密碼校驗(yàn)或者保存到數(shù)據(jù)庫(kù)。
3、單向散列函數(shù) —— MD5(Message Digest Algorithm 5)
MD5 長(zhǎng)度固定,不論輸入的內(nèi)容有多少字節(jié),最終輸出結(jié)果都為 128 bit,即 16 字節(jié)。
這就是為什么 MD5 以及其它單向散列函數(shù)是不可逆的 —— 輸出定長(zhǎng)代表會(huì)有數(shù)據(jù)丟失。
通常,我們可以用 16 進(jìn)制字面值來(lái)表示它,每 4 bit 以 16 進(jìn)制字面值顯示,得到的是一個(gè)長(zhǎng)度為 32 位的字符串。
注意,MD5 等單向散列函數(shù)具有高度的離散性,即:只要輸入的明文不一樣,得到的結(jié)果就完全不一樣,哪怕是僅僅多了一個(gè)空格。
使用場(chǎng)景:
- 可以用來(lái)做密碼的保護(hù)。比如可以不直接存儲(chǔ)用戶的密碼,而是存儲(chǔ)密碼的 MD5 結(jié)果。但是現(xiàn)在一般認(rèn)為用 MD5 來(lái)做加密是不太安全的,更多是利用 MD5 的高度離散性特點(diǎn),用它來(lái)做數(shù)字簽名、完整性校驗(yàn),云盤(pán)秒傳等;
- 數(shù)字簽名。我們可以在發(fā)布程序時(shí)同時(shí)發(fā)布其 MD5,這樣,別人下載程序后自己計(jì)算一遍 MD5,一對(duì)比就知道程序是否被篡改過(guò),比如:植入了木馬。
- 完整性校驗(yàn)。比如前端向后端傳輸一段非常大的數(shù)據(jù),為了防止網(wǎng)絡(luò)傳輸過(guò)程中丟失數(shù)據(jù),可以在前端生成一段數(shù)據(jù)的 MD5 一同傳給后端,這樣后端接收完數(shù)據(jù)后再計(jì)算一次 MD5,就知道數(shù)據(jù)是否完整了。
MD5和SHA
-
MD5 :是RSA數(shù)據(jù)安全公司開(kāi)發(fā)的一種單向散列算法,非可逆,相同的明文產(chǎn)生相同的密文。
-
SHA(Secure Hash Algorithm) :可以對(duì)任意長(zhǎng)度的數(shù)據(jù)運(yùn)算生成一個(gè)固定位數(shù)的數(shù)值。
-
SHA/MD5對(duì)比:SHA在安全性方面優(yōu)于MD5,并且可以選擇多種不同的密鑰長(zhǎng)度。 但是,由于內(nèi)存需求更高,運(yùn)行速度可能會(huì)更慢。 不過(guò),MD5因其速度而得到廣泛使用,但是由于存在碰撞攻擊風(fēng)險(xiǎn),因此不再推薦使用。
三、前端常用的加/解方式
前端常用的方式有:crypto-js、encryptlong、jsencrypt、bcrypt
1、crypto-js
crypto-js支持多種算法:MD5、SHA1、SHA2、SHA3、RIPEMD-160
的哈希散列,以及進(jìn)行 AES、DES、Rabbit、RC4、Triple DES
加解密。
crypto-js
對(duì)象如下:
1)常用加密方法
- 加密函數(shù)的參數(shù):(明文字符串, 密鑰字符串,可選參數(shù)對(duì)象),返回密文字符串。
- 加密函數(shù):
Cryptojs.AES.encrypt
,Cryptojs.DES.encrypt
,Cryptojs.Rabbit.encrypt
,Cryptojs.RC4.encrypt
,Cryptojs.TripleDES.encrypt
2)常用解密方法
- 解密函數(shù)的參數(shù):(密文字符串, 密鑰字符串,可選參數(shù)對(duì)象),返回的結(jié)果必須用
.toString(CryptoJS.enc.Utf8)
轉(zhuǎn)為明文。 - 解密函數(shù)是:
CryptoJS.AES.decrypt
,CryptoJS.DES.decrypt
,CryptoJS.Rabbit.decrypt
,CryptoJS.RC4.decrypt
,CryptoJS.TripleDES.decrypt
3)可選參數(shù)對(duì)象常用屬性
mode
:加密模式
ECB (Electronic Codebook),將整個(gè)明文分成塊,每個(gè)塊獨(dú)立加密??赡艽嬖诎踩詥?wèn)題。
CBC (Cipher Block Chaining),前一個(gè)塊的密文作為下一個(gè)塊的加密向量,提高了安全性。
CFB (Cipher Feedback),前一個(gè)密文塊作為密鑰加密當(dāng)前明文塊,可按比塊更小單位加密。
OFB (Output Feedback),使用函數(shù)產(chǎn)生的密鑰流進(jìn)行異或運(yùn)算,提供加密流。
CTR (Counter),使用計(jì)數(shù)器的值加密,并與明文進(jìn)行異或運(yùn)算,提供加密效果。
CTRGladman,CTRGladman 模式paddig
:填充方式
AnsiX923,在數(shù)據(jù)末尾填充零字節(jié),最后一個(gè)字節(jié)表示需要填充的字節(jié)數(shù)。
Iso10126,在數(shù)據(jù)末尾填充隨機(jī)字節(jié),最后一個(gè)字節(jié)表示需要填充的字節(jié)數(shù)。
Iso97971,使用 ISO/IEC 9797-1 填充方案,在數(shù)據(jù)末尾填充\x80
加上零或多個(gè)\x00
直到塊的大小。
NoPadding,不進(jìn)行任何填充,要求數(shù)據(jù)長(zhǎng)度必須是塊大小的整數(shù)倍。
Pkcs7,使用 PKCS#7填充方案,在數(shù)據(jù)末尾填充字節(jié),字節(jié)的值表示需要填充的字節(jié)數(shù)。
ZeroPadding,在數(shù)據(jù)末尾填充零字節(jié),直到數(shù)據(jù)長(zhǎng)度滿足塊大小的整數(shù)倍。vi
: 偏移向量formatter
:自定義格式enc
: 指定字符編碼模式,包含8 個(gè) API:“Hex”, “Latin1”, “Utf8”, “Utf16BE”, “Utf16”, “Utf16LE”, “Base64”, “Base64url”algo
:包含很多算法- 哈希算法
MD5 (常用),生成 128 位哈希值,用于校驗(yàn)數(shù)據(jù)完整性
SHA1 (常用系列),生成 160 位哈希值
SHA256,生成 256 位哈希值
SHA224,生成 224 位哈希值
SHA512,生成 512 位哈希值
SHA384,生成 384 位哈希值
SHA3,SHA-3 哈希算法
RIPEMD160,另一種生成 160 位哈希值的算法
HMAC,基于密鑰的哈希消息認(rèn)證碼
PBKDF2,密碼基于密鑰派生函數(shù)
EvpKDF,另一種密鑰派生函數(shù) - 對(duì)稱加密算法
AES (常用),高級(jí)加密標(biāo)準(zhǔn),用于對(duì)稱加密和解密數(shù)據(jù)
DES ,數(shù)據(jù)加密標(biāo)準(zhǔn),較早的對(duì)稱加密算法
TripleDES ,對(duì) DES 進(jìn)行多次加密以增加安全性 - 流式加密算法
RC4 ,流式加密算法
RC4Drop,RC4 的變種
Rabbit ,另一種流式加密算法
RabbitLegacy,Rabbit 算法的舊版本 - 其他
Blowfish,對(duì)稱加密算法,用于加密和解密數(shù)據(jù)
- 哈希算法
2、jsencrypt
jsencrypt是一個(gè)基于rsa加解密的js庫(kù)。
new jsencrypt()
如下:
jsencrypt 的加解密過(guò)程需要用到 OpenSSL 來(lái)生成秘鑰,OpenSSL 是一個(gè)開(kāi)源的軟件,它是對(duì) SSL 協(xié)議的實(shí)現(xiàn)。
RSA秘鑰生成方式
- a. 利用工具,在線網(wǎng)站:http://tools.jb51.net/password/rsa_encode
- b. Mac系統(tǒng)內(nèi)置OpenSSL(開(kāi)源加密庫(kù)),所以可以直接在終端上使用命令。
命令 | 含義 |
---|---|
genrsa | 生成并輸入一個(gè)RSA私鑰 |
rsautl | 使用RSA密鑰進(jìn)行加密、解密、簽名和驗(yàn)證等運(yùn)算 |
rsa | 處理RSA密鑰的格式轉(zhuǎn)換等問(wèn)題 |
具體操作:
openssl genrsa -out private.pem 1024 // 生成私鑰,密鑰長(zhǎng)度為1024bit
openssl rsa -in private.pem -pubout -out public.pem // 從私鑰中提取公鑰,同時(shí)會(huì)生成了private.pem 和 public.pem兩個(gè)文件
cat private.pem // 查看私鑰
cat public.pem // 查看公鑰
jsencrypt使用注意點(diǎn)
jsencrypt加密的對(duì)象一定要是字符串,jsencrypt加密長(zhǎng)對(duì)象或者數(shù)據(jù)太多,可能會(huì)返回false
,或者報(bào)錯(cuò):Message too long for RSA
。
可能導(dǎo)致問(wèn)題的原因:
- openssl生成的密匙可能會(huì)有格式問(wèn)題,需要轉(zhuǎn)化一下格式PKCS#1和PKCS#8
- jsencrypt的加密長(zhǎng)度有限制,它只能支持100多位的加密,當(dāng)字符串太長(zhǎng)會(huì)返回false
解決辦法:用encryptlong
3、encryptlong
encryptlong是基于 jsencrypt 擴(kuò)展了長(zhǎng)文本分段加解密功能,即:需要進(jìn)行rsa加密的內(nèi)容比較長(zhǎng)時(shí),就用encryptlong進(jìn)行實(shí)現(xiàn)。
new encryptlong()
如下:
4、bcryptjs
bcrypt是一種用于密碼哈希的加密算法,它是基于Blowfish算法的加強(qiáng)版,生成的密文為60位。
bcrypt是一種加鹽的單向Hash,不可逆的加密算法,同一種明文,每次加密后的密文都不一樣,而且不可反向破解生成明文,破解難度很大。
bcryptjs
對(duì)象如下:
應(yīng)用場(chǎng)景:
- 用戶注冊(cè):當(dāng)用戶注冊(cè)時(shí),需要將其密碼進(jìn)行哈希處理后再存儲(chǔ)到數(shù)據(jù)庫(kù)中。
- 用戶登錄:當(dāng)用戶登錄時(shí),需要將其輸入的密碼與存儲(chǔ)在數(shù)據(jù)庫(kù)中的哈希值進(jìn)行比較,從而得知密碼是否正確。
- 密碼重置:當(dāng)用戶忘記密碼時(shí),可以使用Bcrypt算法生成一個(gè)新的哈希值,用于重置密碼。
bcrypt原理:
bcrypt算法是一種密碼哈希函數(shù),它采用了salt和cost兩種機(jī)制來(lái)增強(qiáng)密碼的安全性。
- salt:為了防止彩虹表攻擊,bcrypt算法會(huì)生成一個(gè)隨機(jī)salt值,將salt與密碼拼接后再進(jìn)行哈希運(yùn)算。這個(gè)salt值是由22個(gè)可打印字符組成的字符串,它的作用是使得相同密碼的哈希值在不同的salt值下產(chǎn)生不同的結(jié)果,從而增加密碼破解的難度。
- cost:bcrypt算法會(huì)將明文密碼和salt進(jìn)行多次迭代的哈希運(yùn)算。迭代的次數(shù)是由cost值決定的,cost值越大,運(yùn)算次數(shù)越多,從而增加密碼破解的難度。通常來(lái)說(shuō),建議將cost值設(shè)置為12,這樣可以保證安全性和性能的平衡。
bcrypt加密后值說(shuō)明
bcrypt 密碼強(qiáng)度一般在10-12。默認(rèn)是10,太強(qiáng)會(huì)導(dǎo)致速度變慢。
加密得到的字符串的格式:$2a $[cost] $[22 character salt] [31 character hash]
cost
:是代價(jià)因子,這里的10 表示是2的10次方,也就是1024輪22 character salt
:16個(gè)字節(jié)(128bits)的salt經(jīng)過(guò)base64編碼得到的22長(zhǎng)度的字符31 character hash
:24個(gè)字節(jié)(192bits)的hash,經(jīng)過(guò)bash64的編碼得到的31長(zhǎng)度的字符
如:
四、具體實(shí)現(xiàn)示例
通過(guò)npm安裝: npm install crypto-js encryptlong jsencrypt bcrypt
1、crypto-js實(shí)現(xiàn)RSA加/解密
import CryptoJS from "crypto-js";const encryptByRSA = (content, publicKey) => {const rsa = new JSEncrypt();rsa.setPublicKey(publicKey);return rsa.encrypt(content);
};const decryptFromRSA = (content, privateKey) => {const rsa = new JSEncrypt();rsa.setPrivateKey(privateKey);return rsa.decrypt(content);
};
2、crypto-js實(shí)現(xiàn)AES加/解密
import CryptoJS from "crypto-js";const encryptByAES = (content, key, iv) => {try {if (typeof content === "object") {content = JSON.stringify(content);}const data = CryptoJS.enc.Utf8.parse(data);const aes = CryptoJS.AES.encrypt(data, key, {mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7,iv: CryptoJS.enc.Utf8.parse(iv)});return aes.ciphertext.toString();} catch (e) {return content;}
};const decryptFromAES = (content, key, iv) => {try {const encryptedHexStr = CryptoJS.enc.Hex.parse(content);const data = CryptoJS.enc.Base64.stringify(encryptedHexStr);const aes = CryptoJS.AES.decrypt(data, key, {mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7,iv: CryptoJS.enc.Utf8.parse(iv)});const originalText = aes.toString(CryptoJS.enc.Utf8);return originalText.toString();} catch (e) {return content;}
};
3、jsencrypt進(jìn)行RSA加/解密
import JSEncrypt from "jsencrypt";// 注:如果是對(duì)象/數(shù)組的話,需要先JSON.stringify轉(zhuǎn)換成字符串
const encryptByRSA = (content, publicKey) => {const rsa = new JSEncrypt();rsa.setPublicKey(publicKey);return rsa.encrypt(content);
};const decryptFromRSA = (content, privateKey) => {const rsa = new JSEncrypt();rsa.setPrivateKey(privateKey);return rsa.decrypt(content);
};
4、encryptlong進(jìn)行RSA加/解密
import JSEncryptLong from "encryptlong";// 注:如果是對(duì)象/數(shù)組的話,需要先JSON.stringify轉(zhuǎn)換成字符串
const encryptLongByRSA = (content, publicKey) => {const rsa = new JSEncryptLong();rsa.setPublicKey(publicKey);return rsa.encryptLong(content);
};const decryptLongFromRSA = (content, privateKey) => {const rsa = new JSEncryptLong();rsa.setPrivateKey(privateKey);return rsa.decryptLong(content);
};
測(cè)試示例:
const PUBLIC_KEY = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKX1Fs2JUD25zrAEwPnjnZC0azrl1XjGzGrJ64eb1lr9QVVOO2zGKZdqDLZD4Ut4Mp6GHMaqqFXKm+zN7IAXu+mqZbUrqUziHE5YGC02wObiZEzfa6V9a8ZvqpB+Z8KO+hAkkjzjMl+E+hDORpZmez3SMzetn7mcCeLw8/vmxz3QIDAQAB`;const PRIVATE_KEY = `MIICXgIBAAKBgQDKX1Fs2JUD25zrAEwPnjnZC0azrl1XjGzGrJ64eb1lr9QVVOO2zGKZdqDLZD4Ut4Mp6GHMaqqFXKm+zN7IAXu+mqZbUrqUziHE5YGC02wObiZEzfa6V9a8ZvqpB+Z8KO+hAkkjzjMl+E+hDORpZmez3SMzetn7mcCeLw8/vmxz3QIDAQABAoGBAJBr6b4V6nJwXdHPyngy4PGl/HTqcK60BkTamALqzmEtU9tNU5z2yz7dy+6awTsjo7Vao8CwNrUp5fHGXw65EEc1/3Iu2Fiix0XF7RP4NFSoxbBmzQW1nUK/5DFi4VR1uhEmdbgLwGabsdqzeUqhRKkRGAPVCotBjaDBOu0J3Mu5AkEA+SM7Ctu7evOvZwjWrp9a5MGxJ9yLLabbIuWL+420jr2G6ojaTZ2ROA2DWWQPx4JqWxDHttomrb38dk2emP2WAwJBAM/yU58YRQ+dTeuTzNYC1JdWcs35n9+hoVP7y+x29CmcqDTPp3nRBbbq88yMb2nZdlwthWi7BurNHsRJFqj0GJ8CQF5gJCuW1UxcJ2PGi1yW7R2e6fcJqoden8B2aDKgmXdBAGyz7s5cE/jB1bH1H60aECPzFVSFCwXh5FMEUEHwPfUCQQC7JqZ57lbhebrSRcA58GwzFFvY40wu8gIHWvwqgti2xsZgWW+qZCPXf9gSBWaUhmJPDa0fGAxesGN7VyhswNuTAkEAzCFNqL/zwHXcwh9YyHTdk/bRWIJq49jTA+vbgGv0szKIvGRKoRbub3NEUiI80TDsCAvbJ6R80J7RjnpmShOwcA==`;const constent = {phone: "8000000001",firstName: "vickie",id: "1234XXXX4567",data: {timestamp: 1572321851823,inter1: ["123123123", "123123123", "123123123", "123123123", "123123123"],inter2: ["123123123", "123123123", "123123123", "123123123", "123123123"],inter3: ["123123123", "123123123", "123123123", "123123123", "123123123"],inter4: ["123123123", "123123123", "123123123", "123123123", "123123123"],inter5: ["123123123", "123123123", "123123123", "123123123", "123123123"],inter6: ["123123123", "123123123", "123123123", "123123123", "123123123"],stream: {},caton: {},card: []}
};
const encryptResult = encryptLongByRSA(JSON.stringify(constent), PUBLIC_KEY);
const decryptResult = decryptLongFromRSA(encryptResult, PRIVATE_KEY);
5、bcrypt進(jìn)行哈希加密
import bcrypt from 'bcryptjs';// 同步實(shí)現(xiàn)hash加密:每一次生成的hash都會(huì)不一樣, cost數(shù)字越大,哈希值就越安全,但性能會(huì)差一點(diǎn)
const encryptHash = (plaintextPassword, cost) => {const salt = bcrypt.genSaltSync(cost);const hash = bcrypt.hashSync(plaintextPassword, salt);return hash;
};// 同步驗(yàn)證
const isPass = (plaintextPassword, hash) => {return bcrypt.compareSync(plaintextPassword, hash);
};// 測(cè)試
const passwordHash = encryptHash("test", 10);
console.log(passwordHash, isPass("test", passwordHash)); // 生成的不可逆密文 true