亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

nodejs中各種加密算法的實現詳解

2024-05-06 16:53:16
字體:
來源:轉載
供稿:網友

前言

在大前端的趨勢下,前端er也要懂點數據加密相關的知識才行,加密算法的實現和原理我們可以不用深究,畢竟加密是一門高深的學科,但是基本的加密方式和編碼還是要掌握的,畢竟沒吃過豬肉,豬跑還是見過的嘛。

我對常見的幾種加密和簽名的算法做個歸納,同時附上 nodejs 的編碼實現。

加密算法

為了保證數據的安全性和防篡改,很多數據在傳輸中都進行了加密。舉個場景的栗子,最近很多網站都升級到 https 協議, https 協議就是使用了非對稱加密和hash簽名,還有 github 使用的 ssh ,也是非對稱加密。還有大部分登錄時密碼采用的 MD5 加密等等。

加密可分為三大類,對稱加密和非對稱加密,還有摘要算法,我們一一展開。

對稱加密

引用百科的描述:

采用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單密鑰加密。

對稱加密很好理解,就好比我把我家的鑰匙給你,你要來我家,直接用這把鑰匙開門就行。

nodejs,加密算法

對稱加密目前主流的有 AES 和 DES , AES 是新一代的標準,速度快,安全級別更高。

AES

AES的加密模式有五種:CBC、ECB、CTR、OCF、CFB

  1. ECB:電子密本方式,需要一個密鑰即可,特點是簡單,利于并行計算。
  2. CBC:密文分組鏈接方式,除了需要一個密鑰之外,還需要一個向量,向量的作用也是用于數據的加密,所以這個的安全性要好于 ECB
  3. CTR、OCF、CFB:具體算法的實現方式不一樣,優缺點也各不相同,而這幾個都同 CBC 一樣,都需要密鑰和向量。

AES 有三種長度 128位、192位、256位,這三種的區別,主要來自于密鑰的長度,16字節密鑰=128位,24字節密鑰=192位,32字節密鑰=256位。如下表格:

 

長度 密鑰長度 向量長度
128位 16 16
192位 24 16
256位 32 16

 

DES

加密默認與 AES 相同,也有五種模式,除了 ECB 只需要密鑰,其他模式需要密鑰和向量。

與 AES 不同的是, DES 的密鑰長度只有8字節,向量也是8字節。

編碼實現

在 nodejs 中的實現

/** * @description  * 對稱加密 * @param {*} data 加密數據 * @param {*} algorithm 加密算法 * @param {*} key 密鑰 * @param {*} iv 向量 * @returns */function cipherivEncrypt(data, algorithm, key, iv) { const cipheriv = crypto.createCipheriv(algorithm, key, iv) let encrypted = cipheriv.update(data, 'utf8', 'hex'); encrypted += cipheriv.final('hex'); return encrypted}/** * @description * 對稱解密 * @param {*} data 解密數據 * @param {*} algorithm 解密算法 * @param {*} key 密鑰 * @param {*} iv 向量 * @returns */function cipherivDecrypt(data, algorithm, key, iv) { const decipher = crypto.createDecipheriv(algorithm, key, iv); let decrypted = decipher.update(data, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted}

使用官方提供 crypto 庫來實現加解密,上面的代碼中加密后輸出的是 16 進制的字符串,大家可以根據具體情況換成其他格式的數據。

調用方式如下

// AES對稱加解密const str = 'xiaoliye';const key = 'aaaaaaaaaaaaaaaaaaaaaaaa'; // 24const iv = 'aaaaaaaaaaaaaaaaaaaaaaaa'; // 24const cipherAesText = cipherivEncrypt(str, 'aes-192-cfb', key,iv)const resultText = cipherivDecrypt(cipherAesText, 'aes-192-cfb', key,iv)console.log(resultText === str) // true
// DES對稱加解密const str = 'xiaoliye';const key = 'aaaaaaaa'; //8const iv = 'aaaaaaaa'; //8const cipherAesText = cipherivEncrypt(str, 'des-cfb', key,iv)const resultText = cipherivDecrypt(cipherAesText, 'des-cfb', key,iv)console.log(resultText === str) / true

非對稱加密

非對稱加密,有兩把鑰匙,公鑰和私鑰,如下圖:

nodejs,加密算法

公鑰是可以公開對外,私鑰就是自個的,不可泄露。因為有兩個密鑰,非對稱加密這個名字就是這么由來的。

發送方用接收方公開對外的公鑰進行加密,接收方收到數據后,用私鑰進行解密,業務處理完后,用私鑰給需要回傳的數據加密,收到數據的一方在用公鑰解密。

這個過程就是非對稱加解密,簡單理解就是公鑰加密的數據,用私鑰解密;私鑰加密的數據,用公鑰解密。

非對稱加密與對稱加密相比,安全性要高很多。對于對稱加密,密鑰鑰匙被某一方不小心泄露了,那秘文就有可能被破解和篡改。而非對稱加密,公鑰隨意流通,只要頒發密鑰的一方好好把私鑰保管好,安全性是妥妥的。

編碼實現

我們來看 node 中的編碼實現,還是使用官方提供的 crypto 庫

  • 加解密函數接收的數據是 Buffer 類型,(關于 Buffer 的介紹,不了解的朋友可以看下這篇二進制與Buffer),所以需要約定好接收和輸出的數據類型。
  • 參數 padding 是填充方式,有這么幾種 crypto.constants.RSA_NO_PADDING, crypto.constants.RSA_PKCS1_PADDING, crypto.constants.RSA_PKCS1_OAEP_PADDING,因為沒有深入研究過,就不展開啦,不過有一點,加密和解密的填充方式必須是要一致的。
const constants = require('constants')const crypto = require('crypto')/** * @description * 公鑰加密數據 * @param {*} data 待加密數據 * @param {*} publicKey 公鑰 * @param {*} inputEncoding 加密數據類型 * @param {*} outputEncoding 輸出的數據類型 * @param {*} padding 填充方式 * @returns */function publicEncrypt(data, publicKey, inputEncoding, outputEncoding, padding) { const encryptText = crypto.publicEncrypt({  key: publicKey,  padding: padding || constants.RSA_PKCS1_PADDING }, Buffer.from(data, inputEncoding)); return encryptText.toString(outputEncoding);}/** * @description * 公鑰解密數據 * @param {*} data 待解密數據 * @param {*} publicKey 公鑰 * @param {*} inputEncoding 解密數據類型 * @param {*} outputEncoding 輸出的數據類型 * @param {*} padding 填充方式 * @returns */function publicDecrypt(data, publicKey, inputEncoding, outputEncoding, padding) { let decryptText = ''; const decryptText = crypto.publicDecrypt({  key: publicKey,  padding: padding || constants.RSA_PKCS1_PADDING }, Buffer.from(data, inputEncoding)); return decryptText.toString(outputEncoding);}/** * @description * 私鑰加密數據 * @param {*} data 待加密數據 * @param {*} privateKey 私鑰 * @param {*} inputEncoding 加密數據類型 * @param {*} outputEncoding 輸出的數據類型 * @param {*} padding 填充方式 * @returns */function privateEncrypt(data, privateKey, inputEncoding, outputEncoding, padding) { const encryptText = crypto.privateEncrypt({  key: privateKey,  padding: padding || constants.RSA_PKCS1_PADDING }, Buffer.from(data, inputEncoding)); return encryptText.toString(outputEncoding);}/** * @description * 私鑰解密數據 * @param {*} data 待解密數據 * @param {*} privateKey 私鑰 * @param {*} inputEncoding 解密數據類型 * @param {*} outputEncoding 輸出的數據類型 * @param {*} padding 填充方式 * @returns */function privateDecrypt(data, privateKey, inputEncoding, outputEncoding, padding) { const decryptText = crypto.privateDecrypt({  key: privateKey,  padding: padding || constants.RSA_PKCS1_PADDING }, Buffer.from(data, inputEncoding)); return decryptText.toString(outputEncoding);}

有四個函數,分別是公鑰的加解密和私鑰的加解密,我們看下如何使用,示例中是我自己生成的密鑰對,大家可以自行替換

const rsaPublicKey = `-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCncWDMXEToSxtGQCmWY2ywl5CQtb81PXYZch4v5M8MNUZPpcmf+VDXQbuWqqTqV/tY7rLviu/BAkFbX9NiFCapF5lPsiVwSGWJQwq0S/++RCwB6yFVEzOKL25jANRBVNwmSOzojveCStYPcEs5Q829ld689TzluDDqUS69dTHGkQIDAQAB-----END PUBLIC KEY-----`const rsaPrivateKey = `-----BEGIN PRIVATE KEY-----MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKdxYMxcROhLG0ZAKZZjbLCXkJC1vzU9dhlyHi/kzww1Rk+lyZ/5UNdBu5aqpOpX+1jusu+K78ECQVtf02IUJqkXmU+yJXBIZYlDCrRL/75ELAHrIVUTM4ovbmMA1EFU3CZI7OiO94JK1g9wSzlDzb2V3rz1POW4MOpRLr11McaRAgMBAAECgYEAhNa8/cQh4sxbKgOTOr1MKFlGFpgpxroo7I0Nh9+Vp1DIpD2Z1PF9ghijEyf0R/pe7LIKgWIPTWdVpIFEeSYVeH43FLr3zwR9oXzwG7RQTSN4d/Xcvg+24ZxCrvDfn7qDIlXh0jOS0wCvna1or7xgPcOuXG8J3BNbBdUixM0lk0ECQQDR4SCelWn0BY21jsFobX+pGqKOsj+tuvU4Cz47Gmevqvq2suYXwLemkP7EqRu8iNso/IzvrdsuJDG76dzwC4D5AkEAzDz2cDrKOVmqYw7sluOQFHl1TzmY7Umpd9YbZ5iXn0eCjIn1/e1risRF5+IeSpB84OVltUzj4cVDCbFd9S1wWQJAIeKcFp5+9cPzxi1fMpIDO3Uua6WBvHXj44GFMZuow+byBY9KsOkPfZgJWg0Hil/6KlrkEkpaic+ULAetASCKWQJAdMh/Gdlj/LsaxJ2qBvWEU1DIFU8X9MbkElPpQ6lrOXaIXZgdgt8ZWTW1y0vuijBoV6iUKcEXpOdI1+gFk8YxsQJBAJsGJClfE1mE6CZgegM82428g4osZznVXBO/QtrQsA78S1xo8bo4qwVm0jQBcto65gwlfeeBXm7MiIvNVBqzTVs=-----END PRIVATE KEY-----`const str = 'xiaoliye'const cipherText = publicEncrypt(str, rsaPublicKey, 'utf8', 'hex') // 公鑰加密const decryptText = privateDecrypt(cipherText, rsaPrivateKey, 'hex', 'utf8') // 私鑰解密console.log(str === decryptText) // trueconst cipherTextPrivate = privateEncrypt(str,rsaPrivateKey,'utf8', 'hex') // 私鑰加密const decryptTextPublic = publicDecrypt(cipherTextPrivate,rsaPublicKey, 'hex', 'utf8') // 公鑰解密console.log(str === decryptTextPublic) // true

密鑰生成方式

網上有很多工具可以一鍵生成配對的公鑰和私鑰,淘寶、微信都有提供相關工具,或者使用 OpenSSL 生成也可以。

摘要算法(HASH)

把任意長度的輸入,根據算法生成一串固定長度的偽隨機數,這一算法就是摘要算法,它有這么幾個特點

  1. 不需要密鑰,加密出來的數據無法被解密,具有不可逆性。
  2. 生成的摘要長度是固定的,與輸入無關。
  3. 相同的輸入,使用相同的實現,生成的摘要一定相同;不同的輸入,生成的摘要是大相徑庭的,即,不會發生碰撞。

根據這些特點,摘要算法通常用于生成簽名,用來驗證數據的完整性。

還有用戶密碼的存儲,如今密碼的存儲主流的方式,就是使用摘要算法生成唯一的標識,為了保證安全性,通常在生成摘要后再加上一串隨機數(加鹽salt),在來hash一次。

目前主流的實現有 MD5 和 SHA-2 , MD5 生成的摘要是 32 字節, sha256 生成的摘要是 64 字節。

編碼實現

仍然是使用官方提供的 crypto 庫

/** * @description * md5 * @param {*} data * @returns */function md5(data){ const hash = crypto.createHash('md5'); return hash.update(data).digest('hex');}/** * @description * sha256 * @param {*} data * @returns */function sha256(data){ const hash = crypto.createHash('sha256'); return hash.update(data).digest('hex');}console.log(md5('asdf')) // 912ec803b2ce49e4a541068d495ab570console.log(sha256('asdf')) // f0e4c2f76c58916ec258f246851bea091d14d4247a2fc3e18694461b1816e13b

小結

涉及加密的活一般是后臺開發干的,但前端靚仔懂點加密,會讓自己酷酷的~

小伙伴們還有遇到啥其他加密的方式,歡迎一起交流啊~

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲电影免费观看高清完整版在线观看| 亚洲电影免费观看高清完整版| 91精品国产色综合久久不卡98| 狠狠干狠狠久久| 国产精品日日做人人爱| 国产精品99久久久久久久久久久久| 一区二区三区四区在线观看视频| 欧美电影在线播放| 亚洲影院高清在线| 91精品久久久久久久久久| 欧美体内谢she精2性欧美| 福利二区91精品bt7086| 亚洲人成人99网站| 91色视频在线导航| 久久久久久久一区二区三区| 亚洲男人天堂2019| www.久久色.com| 欧美黑人一区二区三区| 国产91精品黑色丝袜高跟鞋| 亚洲精品第一国产综合精品| 日韩一区二区三区国产| 欧美在线观看视频| 欧美日韩美女在线| 久久躁狠狠躁夜夜爽| 亚洲精品一区二区三区婷婷月| 亚洲精品国产精品久久清纯直播| 国产日韩精品在线| 欧美另类第一页| 久99九色视频在线观看| 欧美激情一区二区三级高清视频| 国产综合久久久久久| 欧美性生交xxxxx久久久| 国产精品久久久久久av福利| 成人欧美在线观看| 国产精品美女午夜av| 国产午夜精品免费一区二区三区| 日本久久久久久久久| 国产精品无av码在线观看| 欧美激情第1页| 亚洲国产成人久久综合一区| 国产999精品久久久影片官网| 国产日韩欧美在线播放| 欧美成人免费va影院高清| 91高清免费在线观看| 97免费视频在线播放| 久久色在线播放| 777777777亚洲妇女| 永久免费毛片在线播放不卡| 伊人久久精品视频| 亚洲加勒比久久88色综合| 97视频在线观看网址| 欧洲美女免费图片一区| 国产精品视频免费观看www| 久久av.com| 永久免费毛片在线播放不卡| 国产黑人绿帽在线第一区| 播播国产欧美激情| 国产视频久久久久久久| 亚洲伦理中文字幕| 在线观看久久久久久| 亚洲国产欧美久久| 国产欧美精品一区二区三区介绍| 中文在线资源观看视频网站免费不卡| 亚洲第一精品自拍| 日韩av在线网站| 色青青草原桃花久久综合| 成人有码在线视频| 亚洲www永久成人夜色| 亚洲国产高清高潮精品美女| 国产中文欧美精品| 精品视频中文字幕| 久久久久女教师免费一区| 国模私拍视频一区| 激情av一区二区| 韩国精品久久久999| 欧美性色xo影院| 国产精品∨欧美精品v日韩精品| 国产精品久久久久福利| 欧美午夜激情在线| 日产日韩在线亚洲欧美| 国产精品夜间视频香蕉| 久久久人成影片一区二区三区| 亚洲精品中文字幕av| 日韩中文字幕精品视频| 精品国产成人av| 91社区国产高清| 亚洲精品suv精品一区二区| 91高清视频在线免费观看| 91在线观看免费观看| 日韩欧美精品网站| 成人亚洲欧美一区二区三区| 国产精品白丝jk喷水视频一区| 日本不卡视频在线播放| 91地址最新发布| 成人精品福利视频| 国产精品999| 亚洲精品动漫100p| 亚洲国产精品视频在线观看| 日韩一区视频在线| 亚洲精品自拍第一页| 午夜精品一区二区三区在线视| 超碰97人人做人人爱少妇| 欧美日韩成人免费| 成人av.网址在线网站| 亚洲视频在线观看视频| 日韩av在线免费看| 国产欧美日韩中文字幕| 国产亚洲aⅴaaaaaa毛片| 久久五月天色综合| 欧美成人性色生活仑片| 国产欧美日韩高清| 精品无人区乱码1区2区3区在线| 日本免费久久高清视频| 欧美巨猛xxxx猛交黑人97人| 国产欧美最新羞羞视频在线观看| 日本午夜精品理论片a级appf发布| 亚洲国产成人精品电影| 亚洲欧洲在线视频| 国产精品久久久久久亚洲调教| 在线视频精品一| 成人a在线观看| 疯狂欧美牲乱大交777| 欧美亚洲视频一区二区| 91国语精品自产拍在线观看性色| 国产精品私拍pans大尺度在线| 成人免费视频网| 亚洲一区二区久久久| 欧美高清第一页| 中国日韩欧美久久久久久久久| 色综合色综合久久综合频道88| 亚洲免费伊人电影在线观看av| 欧美激情中文字幕在线| 欧洲美女7788成人免费视频| 精品中文字幕久久久久久| 久久国产精品久久久久久久久久| 91青草视频久久| 91美女片黄在线观看游戏| 视频在线观看99| 亚洲国产欧美在线成人app| 在线激情影院一区| 国产精品中文字幕在线| 亚洲欧美激情另类校园| 日韩电影大全免费观看2023年上| 色狠狠久久aa北条麻妃| 成人欧美一区二区三区在线| 欧美国产乱视频| 韩国国内大量揄拍精品视频| 国产91露脸中文字幕在线| 亚洲第一级黄色片| 在线观看成人黄色| 欧美激情视频三区| 中国日韩欧美久久久久久久久| 2023亚洲男人天堂| 97视频在线观看成人| 国产亚洲欧美日韩美女| 在线电影av不卡网址| 亚洲免费人成在线视频观看| 欧美午夜宅男影院在线观看| 国产精品亚洲一区二区三区| 欧美亚洲第一区| 色琪琪综合男人的天堂aⅴ视频| 日本精品va在线观看| 久久精品国产久精国产思思| 日韩动漫免费观看电视剧高清|