[Node.js基礎(chǔ)]學(xué)習(xí)⑨--crypto

crypto模塊提供通用的加密和哈希算法

MD5和SHA1

const crypto = require('crypto');

const hash = crypto.createHash('md5');

// 可任意多次調(diào)用update():
hash.update('Hello, world!');
hash.update('Hello, nodejs!');
//相當(dāng)于hash.update('Hello, world!Hello, nodejs!');

console.log(hash.digest('hex')); //7e1977739c748beac0c0fd14fd26a544

update()方法默認(rèn)字符串編碼為UTF-8

計(jì)算SHA1馏颂,只需要把'md5'改成'sha1'

還可以使用更安全的sha256和sha512示血。

Hmac

用隨機(jī)數(shù)“增強(qiáng)”的哈希算法。

const crypto = require('crypto');

const hmac = crypto.createHmac('sha256', 'secret-key');

hmac.update('Hello, world!');
hmac.update('Hello, nodejs!');

console.log(hmac.digest('hex')); // 80f7e22570...

AES

AES是一種常用的對(duì)稱加密算法救拉,加解密都用同一個(gè)密鑰难审。

const crypto = require('crypto');

function aesEncrypt(data, key) {
    const cipher = crypto.createCipher('aes192', key);
    var crypted = cipher.update(data, 'utf8', 'hex');
    crypted += cipher.final('hex');
    return crypted;
}

function aesDecrypt(encrypted, key) {
    const decipher = crypto.createDecipher('aes192', key);
    var decrypted = decipher.update(encrypted, 'hex', 'utf8');
    decrypted += decipher.final('utf8');
    return decrypted;
}

var data = 'Hello, this is a secret message!';
var key = 'Password!';
var encrypted = aesEncrypt(data, key);
var decrypted = aesDecrypt(encrypted, key);

console.log('Plain text: ' + data);
console.log('Encrypted text: ' + encrypted);
console.log('Decrypted text: ' + decrypted);

運(yùn)行結(jié)果

Plain text: Hello, this is a secret message!
Encrypted text: 8a944d97bdabc157a5b7a40cb180e7...
Decrypted text: Hello, this is a secret message!

Diffie-Hellman

DH算法是一種密鑰交換協(xié)議,它可以讓雙方在不泄漏密鑰的情況下協(xié)商出一個(gè)密鑰來亿絮。DH算法基于數(shù)學(xué)原理告喊,比如小明和小紅想要協(xié)商一個(gè)密鑰,可以這么做:

小明先選一個(gè)素?cái)?shù)和一個(gè)底數(shù)派昧,例如黔姜,素?cái)?shù)p=23,底數(shù)g=5(底數(shù)可以任選)蒂萎,再選擇一個(gè)秘密整數(shù)a=6秆吵,計(jì)算A=g^a mod p=8,然后大聲告訴小紅:p=23五慈,g=5纳寂,A=8;

小紅收到小明發(fā)來的p泻拦,g毙芜,A后,也選一個(gè)秘密整數(shù)b=15争拐,然后計(jì)算B=g^b mod p=19腋粥,并大聲告訴小明:B=19;

小明自己計(jì)算出s=B^a mod p=2陆错,小紅也自己計(jì)算出s=A^b mod p=2灯抛,因此,最終協(xié)商的密鑰s為2音瓷。

在這個(gè)過程中对嚼,密鑰2并不是小明告訴小紅的,也不是小紅告訴小明的绳慎,而是雙方協(xié)商計(jì)算出來的纵竖。第三方只能知道p=23漠烧,g=5,A=8靡砌,B=19已脓,由于不知道雙方選的秘密整數(shù)a=6和b=15,因此無(wú)法計(jì)算出密鑰2通殃。

用crypto模塊實(shí)現(xiàn)DH算法如下:

const crypto = require('crypto');

// xiaoming's keys:
var ming = crypto.createDiffieHellman(512);
var ming_keys = ming.generateKeys();

var prime = ming.getPrime();
var generator = ming.getGenerator();

console.log('Prime: ' + prime.toString('hex'));
console.log('Generator: ' + generator.toString('hex'));

// xiaohong's keys:
var hong = crypto.createDiffieHellman(prime, generator);
var hong_keys = hong.generateKeys();

// exchange and generate secret:
var ming_secret = ming.computeSecret(hong_keys);
var hong_secret = hong.computeSecret(ming_keys);

// print secret:
console.log('Secret of Xiao Ming: ' + ming_secret.toString('hex'));
console.log('Secret of Xiao Hong: ' + hong_secret.toString('hex'));
$ node dh.js 
Prime: a8224c...deead3
Generator: 02
Secret of Xiao Ming: 695308...d519be
Secret of Xiao Hong: 695308...d519be

注意每次輸出都不一樣度液,因?yàn)樗財(cái)?shù)的選擇是隨機(jī)的。

crypto常用算法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末画舌,一起剝皮案震驚了整個(gè)濱河市堕担,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌曲聂,老刑警劉巖霹购,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異朋腋,居然都是意外死亡齐疙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門旭咽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贞奋,“玉大人,你說我怎么就攤上這事穷绵∫涿” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵请垛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我洽议,道長(zhǎng)宗收,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任亚兄,我火速辦了婚禮混稽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘审胚。我一直安慰自己匈勋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布膳叨。 她就那樣靜靜地躺著洽洁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菲嘴。 梳的紋絲不亂的頭發(fā)上饿自,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天汰翠,我揣著相機(jī)與錄音,去河邊找鬼昭雌。 笑死复唤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烛卧。 我是一名探鬼主播佛纫,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼总放!你這毒婦竟也來了冕臭?” 一聲冷哼從身側(cè)響起才睹,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后咒精,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琼蚯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年违施,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尚蝌。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迎变,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出飘言,到底是詐尸還是另有隱情衣形,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布姿鸿,位于F島的核電站谆吴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏苛预。R本人自食惡果不足惜句狼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望热某。 院中可真熱鬧腻菇,春花似錦、人聲如沸昔馋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秘遏。三九已至丘薛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邦危,已是汗流浹背榔袋。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工周拐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凰兑。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓妥粟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親吏够。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勾给,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Node.js是目前非常火熱的技術(shù)锅知,但是它的誕生經(jīng)歷卻很奇特播急。 眾所周知,在Netscape設(shè)計(jì)出JavaScri...
    Myselfyan閱讀 4,071評(píng)論 2 58
  • Node.js是目前非呈鄱茫火熱的技術(shù)桩警,但是它的誕生經(jīng)歷卻很奇特。 眾所周知昌妹,在Netscape設(shè)計(jì)出JavaScri...
    w_zhuan閱讀 3,613評(píng)論 2 41
  • 0x01 目錄 常見編碼: ASCII編碼 Base64/32/16編碼 shellcode編碼 Quoted-p...
    H0f_9閱讀 12,766評(píng)論 2 17
  • MD5的全稱是Message-Digest Algorithm 5捶枢,在90年代初由MIT的計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室和RSA...
    沒能唱給你的歌曲閱讀 957評(píng)論 2 6
  • 夏夜并不算寂靜,躺在被蚊帳包圍的床上飞崖,宋穩(wěn)穩(wěn)聽著宿舍樓外的生物的響聲烂叔。對(duì),她就是這么無(wú)聊固歪,不是學(xué)生會(huì)的蒜鸡,不是班委中...
    笛安漁閱讀 194評(píng)論 0 0