nodejs加密與解密

加密分類

可逆加密和不可逆加密

  1. 不可逆加密: 加密后不可解密,只能通過碰撞密文以極小的概率解密;
  2. 可逆加密: 加密后可以解密;包括對稱加密非對稱加密;
    1. 對稱加密雙方采用共同密鑰;
    2. 非對稱加密: 這種加密方式存在兩個密鑰盖奈,密鑰-- 一種是公鑰季希,一種是密鑰肆饶。使用公鑰加密,則只能使用密鑰解密呻袭,使用密鑰加密露戒,則只能使用公鑰解密;

不可逆加密

    const crypto = require('crypto');

    let str = 'abcd';
    let password = 'hello';
    // 不可逆加密

    // 支持md5/sha1/sha256等加密
    let data1 = crypto.createHash('md5').update(str).digest('hex');
    console.log(data1);

    // 以指定key作為密碼進行加密
    let data2 = crypto.createHmac('md5', password).update(str).digest('hex');
    console.log(data2);

可逆加密

對稱加解密

    const crypto = require('crypto');
    let str = 'abcd';
    const password = 'FnJL7EDzjqWjcaY9';
    const iv = 'FnJL7EDzjqWjcaY9';
    // 加密
    const cipher = crypto.createCipheriv('aes-128-cbc', password, iv);
    cipher.update(str,'utf8', 'hex')
    let data3 = cipher.final('hex');
    console.log(data3);

    // 解密
    const decipher = crypto.createDecipheriv('aes-128-cbc', password, iv);
    decipher.update(data3, 'hex', 'utf8')
    let data4 = decipher.final().toString();
    console.log(data4);

非對稱加解密(基于公鑰密鑰)

  1. 生成公鑰密鑰

     openssl genrsa -out server.key
     openssl req -new -key server.key -out server.csr
     openssl x509 -req  -in server.csr -signkey server.key -out server.crt
    
    
  2. 驗證證書功能

     const crypto = require('crypto');
     const fs = require('fs');
     const sign = crypto.createSign('RSA-SHA256');
     const verify = crypto.createVerify('RSA-SHA256');
     const privateKey = fs.readFileSync('./server.key').toString();         //rsa私鑰
     const publicKey = fs.readFileSync('./server.crt').toString();
     const str = 'abcd';
    
     sign.update(str);
     verify.update(str);
    
     let signture = sign.sign(privateKey);
     let result = verify.verify(publicKey, signture);
     console.log(result);         // true/false
    
    
  3. 公鑰密鑰加解密

     const crypto = require('crypto');
     const fs = require('fs');
     const privateKey = fs.readFileSync('./server.key').toString();         //rsa私鑰
     const publicKey = fs.readFileSync('./server.crt').toString();
     const str = 'abcd';
    
     // 公鑰加密,密鑰解密
     const publicEncodeData = crypto.publicEncrypt(publicKey, Buffer.from(str)).toString('base64');
     console.log("encode: ", publicEncodeData);
     const privateDecodeData = crypto.privateDecrypt(privateKey, Buffer.from(publicEncodeData.toString('base64'), 'base64'));
     console.log("decode: ", privateDecodeData.toString())
    
     // 密鑰加密,公鑰解密
     const privateEncodeData = crypto.privateEncrypt(privateKey, Buffer.from(str)).toString('base64');
     console.log("encode: ", privateEncodeData);
     const publicDecodeData = crypto.publicDecrypt(privateKey, Buffer.from(privateEncodeData.toString('base64'), 'base64'));
     console.log("decode: ", publicDecodeData.toString())
    

example

var crypto = require('crypto');

/**
 * 加密方法
 * @param key 加密key
 * @param iv       向量
 * @param data     需要加密的數(shù)據(jù)
 * @returns string
 */
var encrypt = function (key, iv, data) {
    var cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
    var crypted = cipher.update(data, 'utf8', 'binary');
    crypted += cipher.final('binary');
    crypted = Buffer.from(crypted, 'binary').toString('base64');
    return crypted;
};

/**
 * 解密方法
 * @param key      解密的key
 * @param iv       向量
 * @param crypted  密文
 * @returns string
 */
var decrypt = function (key, iv, crypted) {
    crypted = Buffer.from(crypted, 'base64').toString('binary');
    var decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
    var decoded = decipher.update(crypted, 'binary', 'utf8');
    decoded += decipher.final('utf8');
    return decoded;
};

var key = '751f621ea5c8f930';
console.log('加密的key:', key.toString('hex'));
var iv = '2624750004598718';
console.log('加密的iv:', iv);
// var data = "Hello, nodejs. 演示aes-128-cbc加密和解密";
var data =JSON.stringify({user: "www", pass:"wwwww/"})
console.log("需要加密的數(shù)據(jù):", data);
var crypted = encrypt(key, iv, data);
console.log("數(shù)據(jù)加密后:", crypted);
var dec = decrypt(key, iv, crypted);
console.log("數(shù)據(jù)解密后:", JSON.parse(dec));
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末迄埃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兑障,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件流译,死亡現(xiàn)場離奇詭異逞怨,居然都是意外死亡,警方通過查閱死者的電腦和手機福澡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門叠赦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人革砸,你說我怎么就攤上這事除秀。” “怎么了算利?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵册踩,是天一觀的道長。 經常有香客問我效拭,道長暂吉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任缎患,我火速辦了婚禮慕的,結果婚禮上,老公的妹妹穿的比我還像新娘挤渔。我一直安慰自己肮街,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布判导。 她就那樣靜靜地躺著嫉父,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骡楼。 梳的紋絲不亂的頭發(fā)上熔号,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音鸟整,去河邊找鬼引镊。 笑死,一個胖子當著我的面吹牛篮条,可吹牛的內容都是我干的弟头。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼涉茧,長吁一口氣:“原來是場噩夢啊……” “哼赴恨!你這毒婦竟也來了?” 一聲冷哼從身側響起伴栓,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤伦连,失蹤者是張志新(化名)和其女友劉穎雨饺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惑淳,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡额港,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了歧焦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片移斩。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绢馍,靈堂內的尸體忽然破棺而出向瓷,到底是詐尸還是另有隱情,我是刑警寧澤舰涌,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布猖任,位于F島的核電站,受9級特大地震影響舵稠,放射性物質發(fā)生泄漏超升。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一哺徊、第九天 我趴在偏房一處隱蔽的房頂上張望室琢。 院中可真熱鬧,春花似錦落追、人聲如沸盈滴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巢钓。三九已至,卻和暖如春疗垛,著一層夾襖步出監(jiān)牢的瞬間症汹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工贷腕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留背镇,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓泽裳,卻偏偏與公主長得像瞒斩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子涮总,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345