目錄
前面的話
crypto
MD5
Hmac
AES
Diffie-Hellman
首頁 web前端 js教程 nodeJS之crypto加密方式的詳解

nodeJS之crypto加密方式的詳解

Jun 24, 2017 pm 02:49 PM
Crypto javascript nodejs 加密

前面的話

  加密模組提供了 HTTP 或 HTTPS 連線過程中封裝安全憑證的方法。也提供了 OpenSSL 的哈希,hmac, 加密(cipher), 解密(decipher), 簽章(sign) 和 驗證(verify) 方法的封裝。本文將詳細介紹加密crypto

 

crypto

【crypto.setEngine(engine[, flags])】

  為某些/所有OpenSSL 函數載入並設定引擎(根據參數flags 來設定)。

  engine 可能是 id,或是指向引擎共用程式庫的路徑。

  flags是可選參數,預設值是ENGINE_METHOD_ALL ,可以是以下一個或多個參數的組合(在constants裡定義)

ENGINE_METHOD_RSA
ENGINE_METHOD_DSA
ENGINE_METHOD_DH
ENGINE_METHOD_RAND
ENGINE_METHOD_ECDH
ENGINE_METHOD_ECDSA
ENGINE_METHOD_CIPHERS
ENGINE_METHOD_DIGESTS
ENGINE_METHOD_STORE
ENGINE_METHOD_PKEY_METH
ENGINE_METHOD_PKEY_ASN1_METH
ENGINE_METHOD_ALL
ENGINE_METHOD_NONE
登入後複製

【crypto.getCiphers ()】

  傳回支援的加密演算法名稱數組

 crypto = require('crypto'
登入後複製

【crypto.getCiphers()】

  傳回支援的雜湊演算法名稱陣列。

var crypto = require('crypto');
console.log(crypto.getHashes());//[ 'DSA',  'DSA-SHA',  'DSA-SHA1',  'DSA-SHA1-old',  'RSA-MD4',  'RSA-MD5',  'RSA-MDC2',  'RSA-RIPEMD160',  'RSA-SHA',  'RSA-SHA1',  'RSA-SHA1-2',  'RSA-SHA224',  'RSA-SHA256',  'RSA-SHA384',  'RSA-SHA512',  'dsaEncryption',  'dsaWithSHA',  'dsaWithSHA1',  'dss1',  'ecdsa-with-SHA1',  'md4',  'md4WithRSAEncryption',  'md5',  'md5WithRSAEncryption',  'mdc2',  'mdc2WithRSA',  'ripemd',  'ripemd160',  'ripemd160WithRSA',  'rmd160',  'sha',  'sha1',  'sha1WithRSAEncryption',  'sha224',  'sha224WithRSAEncryption',  'sha256',  'sha256WithRSAEncryption',  'sha384',  'sha384WithRSAEncryption',  'sha512',  'sha512WithRSAEncryption',  'shaWithRSAEncryption',  'ssl2-md5',  'ssl3-md5',  'ssl3-sha1',  'whirlpool' ]
登入後複製

【crypto.getCurves()】

#  傳回支援的橢圓曲線名稱數組。

var crypto = require('crypto');
console.log(crypto.getCurves());//[ 'Oakley-EC2N-3',  'Oakley-EC2N-4',  'brainpoolP160r1',  'brainpoolP160t1',  'brainpoolP192r1',  'brainpoolP192t1',  'brainpoolP224r1',  'brainpoolP224t1',  'brainpoolP256r1',  'brainpoolP256t1',  'brainpoolP320r1',  'brainpoolP320t1',  'brainpoolP384r1',  'brainpoolP384t1',  'brainpoolP512r1',  'brainpoolP512t1',  'c2pnb163v1',  'c2pnb163v2',  'c2pnb163v3',  'c2pnb176v1',  'c2pnb208w1',  'c2pnb272w1',  'c2pnb304w1',  'c2pnb368w1',  'c2tnb191v1',  'c2tnb191v2',  'c2tnb191v3',  'c2tnb239v1',  'c2tnb239v2',  'c2tnb239v3',  'c2tnb359v1',  'c2tnb431r1',  'prime192v1',  'prime192v2',  'prime192v3',  'prime239v1',  'prime239v2',  'prime239v3',  'prime256v1',  'secp112r1',  'secp112r2',  'secp128r1',  'secp128r2',  'secp160k1',  'secp160r1',  'secp160r2',  'secp192k1',  'secp224k1',  'secp224r1',  'secp256k1',  'secp384r1',  'secp521r1',  'sect113r1',  'sect113r2',  'sect131r1',  'sect131r2',  'sect163k1',  'sect163r1',  'sect163r2',  'sect193r1',  'sect193r2',  'sect233k1',  'sect233r1',  'sect239k1',  'sect283k1',  'sect283r1',  'sect409k1',  'sect409r1',  'sect571k1',  'sect571r1',  'wap-wsg-idm-ecid-wtls1',  'wap-wsg-idm-ecid-wtls10',  'wap-wsg-idm-ecid-wtls11',  'wap-wsg-idm-ecid-wtls12',  'wap-wsg-idm-ecid-wtls3',  'wap-wsg-idm-ecid-wtls4',  'wap-wsg-idm-ecid-wtls5',  'wap-wsg-idm-ecid-wtls6',  'wap-wsg-idm-ecid-wtls7',  'wap-wsg-idm-ecid-wtls8',  'wap-wsg-idm-ecid-wtls9' ]
登入後複製

 

MD5

#  MD5是一種常用的雜湊演算法,用於給任何資料一個「簽章」。這個簽章通常用一個十六進制的字串表示:

【crypto.createHash(algorithm)】

  創建並傳回一個哈希對象,使用指定的演算法來產生哈希摘要。

  參數 algorithm 取決於平台上 OpenSSL 版本所支援的演算法。例如,'sha1', 'md5', 'sha256', 'sha512' 等等

#【hash.update(data[, input_encoding])】

#  根據data 來更新雜湊內容,編碼方式根據input_encoding 來定,有'utf8', 'ascii' 或'binary'。如果沒有傳入值,預設編碼方式是'utf8'。如果 data 是 Buffer, input_encoding 將會被忽略。

  因為它是串流數據,所以可以使用不同的資料呼叫很多次。

【hash.digest([encoding])】

  計算傳入的資料的雜湊摘要。 encoding 可以是 'hex', 'binary' 或 'base64',如果沒有指定encoding ,將傳回 buffer。

  [注意]呼叫 digest() 後不能再用 hash 物件。

var crypto = require('crypto');var hash = crypto.createHash('md5');// 可任意多次调用update():hash.update('Hello, world!');
hash.update('Hello, nodejs!');

console.log(hash.digest('hex')); // 7e1977739c748beac0c0fd14fd26a544
登入後複製

 

Hmac

  Hmac演算法也是一種雜湊演算法,它可以利用MD5或SHA1等雜湊演算法。不同的是,Hmac還需要一個金鑰:

【crypto.createHmac(algorithm, key)】

  建立並傳回一個hmac 對象,用指定的演算法和秘鑰產生hmac 圖譜。

  它是可讀寫的流 stream 。寫入的資料來用計算 hmac。當寫入流結束後,使用 read() 方法來取得計算後的值。也支援老的 update 和 digest 方法。

  參數 algorithm 取決於平台上 OpenSSL 版本所支援的演算法,請參閱前面的 createHash。 key是 hmac 演算法中用的 key

【hmac.update(data)】

  根據 data 更新 hmac 物件。因為它是串流數據,所以可以使用新數據呼叫多次。

【hmac.digest([encoding])】

  計算傳入資料的 hmac 值。 encoding可以是 'hex', 'binary' 或 'base64',如果沒有指定encoding ,將傳回 buffer。

  [注意]呼叫 digest() 後不能再用 hmac 物件

var crypto = require('crypto');var hmac = crypto.createHmac('sha256', 'match');

hmac.update('Hello, world!');
hmac.update('Hello, nodejs!');//e82a58066cae2fae4f44e58be1d589b66a5d102c2e8846d796607f02a88c1649console.log(hmac.digest('hex'));
登入後複製

 

AES

  AES是一种常用的对称加密算法,加解密都用同一个密钥。crypto模块提供了AES支持,但是需要自己封装好函数,便于使用:

【crypto.createCipher(algorithm, password)】

  使用传入的算法和秘钥来生成并返回加密对象。

  algorithm 取决于 OpenSSL,例如'aes192'等。password 用来派生 key 和 IV,它必须是一个'binary' 编码的字符串或者一个buffer。

  它是可读写的流 stream 。写入的数据来用计算 hmac。当写入流结束后,使用 read() 方法来获取计算后的值。也支持老的update 和 digest 方法。

【cipher.update(data[, input_encoding][, output_encoding])】

  根据 data 来更新哈希内容,编码方式根据 input_encoding 来定,有 'utf8', 'ascii' or 'binary'。如果没有传入值,默认编码方式是'binary'。如果data 是 Buffer,input_encoding 将会被忽略。

  output_encoding 指定了输出的加密数据的编码格式,它可用是 'binary', 'base64' 或 'hex'。如果没有提供编码,将返回 buffer 。

  返回加密后的内容,因为它是流式数据,所以可以使用不同的数据调用很多次。

【cipher.final([output_encoding])】

  返回加密后的内容,编码方式是由 output_encoding 指定,可以是 'binary', 'base64' 或 'hex'。如果没有传入值,将返回 buffer。

  [注意]cipher 对象不能在 final() 方法之后调用。

var 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;
}var data = 'Hello, this is a secret message!';var key = 'Password!';var encrypted = aesEncrypt(data, key);//8a944d97bdabc157a5b7a40cb180e713f901d2eb454220d6aaa1984831e17231f87799ef334e3825123658c80e0e5d0cconsole.log(encrypted);
登入後複製

【crypto.createDecipher(algorithm, password)】

  根据传入的算法和密钥,创建并返回一个解密对象。这是 createCipher() 的镜像

【decipher.update(data[, input_encoding][, output_encoding])】

  使用参数 data 更新需要解密的内容,其编码方式是 'binary','base64' 或 'hex'。如果没有指定编码方式,则把 data 当成 buffer 对象。

  如果 data 是 Buffer,则忽略 input_encoding 参数。

  参数 output_decoding 指定返回文本的格式,是 'binary', 'ascii' 或 'utf8' 之一。如果没有提供编码格式,则返回 buffer。

【decipher.final([output_encoding])】

  返回剩余的解密过的内容,参数 output_encoding 是 'binary', 'ascii' 或 'utf8',如果没有指定编码方式,返回 buffer。

  [注意]decipher对象不能在 final() 方法之后使用。

var crypto = require('crypto');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 = '8a944d97bdabc157a5b7a40cb180e713f901d2eb454220d6aaa1984831e17231f87799ef334e3825123658c80e0e5d0c';var decrypted = aesDecrypt(encrypted, key);
console.log(decrypted);//Hello, this is a secret message!
登入後複製

  可以看出,加密后的字符串通过解密又得到了原始内容。

  注意到AES有很多不同的算法,如aes192aes-128-ecbaes-256-cbc等,AES除了密钥外还可以指定IV(Initial Vector),不同的系统只要IV不同,用相同的密钥加密相同的数据得到的加密结果也是不同的。加密结果通常有两种表示方法:hex和base64,这些功能Nodejs全部都支持,但是在应用中要注意,如果加解密双方一方用Nodejs,另一方用Java、PHP等其它语言,需要仔细测试。如果无法正确解密,要确认双方是否遵循同样的AES算法,字符串密钥和IV是否相同,加密后的数据是否统一为hex或base64格式

【crypto.createCipheriv(algorithm, key, iv)】

  创建并返回一个加密对象,用指定的算法,key 和 iv。

  algorithm 参数和 createCipher() 一致。key 在算法中用到.iv 是一个initialization vector.

  key 和 iv 必须是 'binary' 的编码字符串或buffers.

【crypto.createDecipheriv(algorithm, key, iv)】

  根据传入的算法,密钥和 iv,创建并返回一个解密对象。这是 createCipheriv() 的镜像。

const crypto = require('crypto');function aesEncryptiv(data, key,iv) {
    const cipher = crypto.createCipher('aes192', key, iv);var crypted = cipher.update(data, 'utf8', 'hex');
    crypted += cipher.final('hex');return crypted;
}function aesDecryptiv(encrypted, key,iv) {
    const decipher = crypto.createDecipher('aes192', key, iv);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 iv = 'match';var encrypted = aesEncryptiv(data, key, iv);var decrypted = aesDecryptiv(encrypted, key, iv);//Hello, this is a secret message!console.log(data);//8a944d97bdabc157a5b7a40cb180e713f901d2eb454220d6aaa1984831e17231f87799ef334e3825123658c80e0e5d0cconsole.log(encrypted);//Hello, this is a secret message!console.log(decrypted);
登入後複製

 

Diffie-Hellman

【crypto.createDiffieHellman(prime[, prime_encoding][, generator][, generator_encoding])】

  使用传入的 prime 和 generator 创建 Diffie-Hellman 秘钥交互对象。

  generator 可以是数字,字符串或Buffer。如果没有指定 generator,使用 2

  prime_encoding 和 generator_encoding 可以是 'binary', 'hex', 或 'base64'。

  如果没有指定 prime_encoding, 则 Buffer 为 prime。如果没有指定 generator_encoding ,则 Buffer 为 generator。

【diffieHellman.generateKeys([encoding])】

  生成秘钥和公钥,并返回指定格式的公钥。这个值必须传给其他部分。编码方式: 'binary', 'hex', 或 'base64'。如果没有指定编码方式,将返回 buffer。

【diffieHellman.getPrime([encoding])】

  用参数 encoding 指明的编码方式返回 Diffie-Hellman 质数,编码方式为: 'binary', 'hex', 或 'base64'。 如果没有指定编码方式,将返回 buffer。

【diffieHellman.getGenerator([encoding])】

  用参数 encoding 指明的编码方式返回 Diffie-Hellman 生成器,编码方式为: 'binary', 'hex', 或 'base64'. 如果没有指定编码方式 ,将返回 buffer。

【diffieHellman.computeSecret(other_public_key[, input_encoding][, output_encoding])】

  使用 other_public_key 作为第三方公钥来计算并返回共享秘密(shared secret)。秘钥用input_encoding 编码。编码方式为:'binary', 'hex', 或 'base64'。如果没有指定编码方式 ,默认为 buffer。

  如果没有指定返回编码方式,将返回 buffer。

DH算法

  DH算法是一种密钥交换协议,它可以让双方在不泄漏密钥的情况下协商出一个密钥来。DH算法基于数学原理,比如小明和小红想要协商一个密钥,可以这么做:

  1、小明先选一个素数和一个底数,例如,素数p=23,底数g=5(底数可以任选),再选择一个秘密整数a=6,计算A=g^a mod p=8,然后大声告诉小红:p=23,g=5,A=8;

  2、小红收到小明发来的p,g,A后,也选一个秘密整数b=15,然后计算B=g^b mod p=19,并大声告诉小明:B=19;

  3、小明自己计算出s=B^a mod p=2,小红也自己计算出s=A^b mod p=2,因此,最终协商的密钥s为2。

  在这个过程中,密钥2并不是小明告诉小红的,也不是小红告诉小明的,而是双方协商计算出来的。第三方只能知道p=23,g=5,A=8,B=19,由于不知道双方选的秘密整数a=6和b=15,因此无法计算出密钥2。

  用crypto模块实现DH算法如下:

var crypto = require('crypto');// xiaoming's keys:var ming = crypto.createDiffieHellman(512);var ming_keys = ming.generateKeys();var prime = ming.getPrime();var generator = ming.getGenerator();//Prime: 8df777257625c66821af697652f28e93af05b9f779af919111b89816faa11c36fcf9df04c76811471a6099800213c4fe8e3fbec8d2f90bd00795e4b7fd241603console.log('Prime: ' + prime.toString('hex'));//Generator: 02console.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);//Secret of Xiao Ming: 4237157ab4c9211f78ffdb67d127d749cec91780d594b81a7e75f1fb591fecb84f33ae6591e1edda4bc9685b503010fe8f9928c6ed69e4ff9fdb44adb9ba1539console.log('Secret of Xiao Ming: ' + ming_secret.toString('hex'));//Secret of Xiao Hong: 4237157ab4c9211f78ffdb67d127d749cec91780d594b81a7e75f1fb591fecb84f33ae6591e1edda4bc9685b503010fe8f9928c6ed69e4ff9fdb44adb9ba1539console.log('Secret of Xiao Hong: ' + hong_secret.toString('hex'))
登入後複製

   [注意]每次输出都不一样,因为素数的选择是随机的。

以上是nodeJS之crypto加密方式的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

下一個 Meme 幣超級週期:認識 XYZVerse (XYZ),體育和 Meme 文化的重量級冠軍 下一個 Meme 幣超級週期:認識 XYZVerse (XYZ),體育和 Meme 文化的重量級冠軍 Nov 03, 2024 pm 09:36 PM

隨著 2024 年最後一個季度加密世界的興奮情緒不斷升溫,投資者正在尋找有潛力帶來非凡回報的數位資產。來自成功加密數字的見解表明某些代幣可能會上漲

gate.io安裝包免費拿 gate.io安裝包免費拿 Feb 21, 2025 pm 08:21 PM

Gate.io是一款受歡迎的加密貨幣交易所,用戶可通過下載其安裝包並安裝在設備上使用。獲取安裝包步驟如下:訪問Gate.io官方網站,點擊“下載”,選擇對應操作系統(Windows、Mac或Linux),將安裝包下載至計算機。安裝過程中建議暫時禁用殺毒軟件或防火牆,確保安裝順利。完成後,用戶需創建Gate.io賬戶以開始使用。

加密貨幣影響者 Cobie 銷毀了透過 Pump.fun 發行的 Solana (SOL) Meme 硬幣供應量的 60% 加密貨幣影響者 Cobie 銷毀了透過 Pump.fun 發行的 Solana (SOL) Meme 硬幣供應量的 60% Nov 09, 2024 am 04:14 AM

Jordan Fish(更通俗地稱為 Cobie)於 11 月 8 日星期五燒毀了透過 Pump.fun 發行的 Solana (SOL) 模因幣供應量的 60%

幣圈前十交易所名單 幣圈前十交易所名單 Feb 21, 2025 pm 10:18 PM

幣圈前十交易所按交易量排名為:幣安歐易火幣FTXKrakenCoinbaseGeminiBitfinexBybitGate.io

十大虛擬幣交易app哪個好  十大虛擬幣交易app哪個最可靠 十大虛擬幣交易app哪個好 十大虛擬幣交易app哪個最可靠 Mar 19, 2025 pm 05:00 PM

十大虛擬幣交易app排名:1. OKX,2. Binance,3. Gate.io,4. Kraken,5. Huobi,6. Coinbase,7. KuCoin,8. Crypto.com,9. Bitfinex,10. Gemini。選擇平台時應考慮安全性、流動性、手續費、幣種選擇、用戶界面和客戶支持。

比特幣購買平台排行榜(2025最新更新) 比特幣購買平台排行榜(2025最新更新) Feb 21, 2025 pm 07:12 PM

在數字資產領域,比特幣作為一種備受矚目的加密貨幣,其交易需求不斷增長。本文將深入探討全球十大比特幣買賣平台,提供綜合排行榜,幫助讀者選擇最適合其交易需求的平台。

歐易ok交易所官方入口登錄 歐易ok交易所官方入口登錄 Feb 21, 2025 pm 05:33 PM

歐易交易所,全球領先的加密貨幣交易平台之一,為用戶提供安全可靠的數字資產交易服務。其官方入口連接可直接進入平台,便捷高效地進行資產管理、交易和投資。通過採用先進的技術和風控措施,歐易致力於打造一個安全穩健的交易環境,讓用戶放心交易,享受數字資產世界的便利和收益。

數字虛擬貨幣十大交易平台排行榜2025最新 數字虛擬貨幣十大交易平台排行榜2025最新 Mar 21, 2025 pm 03:27 PM

2025年數字虛擬貨幣十大交易平台排行榜:1. OKX,2. Binance,3. Gate.io,4. Kraken,5. Huobi Global,6. Coinbase,7. KuCoin,8. Crypto.com,9. Bitfinex,10. MEXC Global。這些平台因其交易量、用戶體驗、安全性和幣種豐富度等因素被評選為最佳,選擇時需考慮交易費用、平台安全性

See all articles