目次
前の言葉
crypto
MD5
Hmac
AES
Diffie-Hellman
ホームページ ウェブフロントエンド jsチュートリアル NodeJSのcrypto暗号化方式の詳細説明

NodeJSのcrypto暗号化方式の詳細説明

Jun 24, 2017 pm 02:49 PM
Crypto javascript nodejs 暗号化

前の言葉

暗号化モジュールは、HTTP または HTTPS 接続中にセキュリティ資格情報をカプセル化する方法を提供します。 OpenSSL のハッシュ、hmac、暗号化 (cipher)、復号化 (decopher)、署名 (sign)、検証 (verify) メソッドのカプセル化も提供されます。この記事では、crypto

crypto

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

一部/すべてのOpenSSL関数のエンジンのロードと設定(パラメータflagsに応じて設定)を詳しく紹介します。

engine は ID、またはエンジン共有ライブラリへのパスの場合があります。

flags はオプションのパラメータで、デフォルト値は ENGINE_METHOD_ALL で、次のパラメータ (定数で定義) を 1 つ以上組み合わせることができます

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 は、データに「署名」を与えるために使用される一般的に使用されるハッシュ アルゴリズムです。この署名は通常、16 進数の文字列で表されます:

[crypto.createHash(algorithm)]

指定されたアルゴリズムを使用してハッシュ ダイジェストを生成し、ハッシュ オブジェクトを作成して返します。

パラメータのアルゴリズムは、プラットフォームのOpenSSLバージョンでサポートされているアルゴリズムに依存します。例えば、'sha1'、'md5'、'sha256'、'sha512'などです

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

データに応じてハッシュの内容を更新し、エンコード方法はinput_encoding に応じて決定されます。「utf8」、「ascii」、または「binary」があります。値が渡されない場合、デフォルトのエンコードは「utf8」です。データがバッファの場合、input_encoding は無視されます。

ストリーミングデータなので、異なるデータで何度でも呼び出すことができます。

【hash.digest([encoding])】

受信データのハッシュダイジェストを計算します。エンコーディングは「hex」、「binary」、または「base64」にすることができます。エンコーディングが指定されていない場合は、バッファが返されます。

【注意】digest()呼び出し後はハッシュオブジェクトを使用できません。

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 マップを生成します。

読み書き可能なストリームです。書き込まれたデータは hmac の計算に使用されます。ストリームへの書き込みが終了したら、read()メソッドを使用して計算値を取得します。古い更新方法とダイジェスト方法もサポートされています。

パラメータのアルゴリズムは、プラットフォーム上の OpenSSL バージョンでサポートされているアルゴリズムに依存します。上記の createHash を参照してください。キーはhmacアルゴリズムで使用されるキーです

[hmac.update(data)]

データを元にhmacオブジェクトを更新します。ストリーミング データであるため、新しいデータで複数回呼び出すことができます。

【hmac.digest([encoding])】

受信データのhmac値を計算します。エンコーディングは「hex」、「binary」、または「base64」にすることができます。エンコーディングが指定されていない場合は、バッファが返されます。

【注意】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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

次のミームコインスーパーサイクル: スポーツとミームカルチャーのヘビー級チャンピオン、XYZVerse (XYZ) を紹介します 次のミームコインスーパーサイクル: スポーツとミームカルチャーのヘビー級チャンピオン、XYZVerse (XYZ) を紹介します Nov 03, 2024 pm 09:36 PM

2024 年の最終四半期に向けて暗号通貨の世界が興奮を高める中、投資家は並外れた利益をもたらす可能性のあるデジタル資産に注目しています。成功した仮想通貨の数字からの洞察は、特定のトークンが期限切れになる可能性があることを示しています

gate.ioインストールパッケージを無料で入手してください gate.ioインストールパッケージを無料で入手してください Feb 21, 2025 pm 08:21 PM

Gate.ioは、インストールパッケージをダウンロードしてデバイスにインストールすることで使用できる人気のある暗号通貨交換です。インストールパッケージを取得する手順は次のとおりです。Gate.ioの公式Webサイトにアクセスし、「ダウンロード」をクリックし、対応するオペレーティングシステム(Windows、Mac、またはLinux)を選択し、インストールパッケージをコンピューターにダウンロードします。スムーズなインストールを確保するために、インストール中に一時的にウイルス対策ソフトウェアまたはファイアウォールを一時的に無効にすることをお勧めします。完了後、ユーザーはGATE.IOアカウントを作成して使用を開始する必要があります。

通貨サークルのトップ10の交換のリスト 通貨サークルのトップ10の交換のリスト Feb 21, 2025 pm 10:18 PM

通貨サークルの上位10の取引所は、取引量によってランク付けされています:Binance ouyihuobi ftxkrakencoinbasegeminibitfinexbybitgate.io

仮想通貨インフルエンサーのコビーが、Pump.fun経由で発行されたソラナ(SOL)ミームコインの供給量の60%を消費 仮想通貨インフルエンサーのコビーが、Pump.fun経由で発行されたソラナ(SOL)ミームコインの供給量の60%を消費 Nov 09, 2024 am 04:14 AM

コビーとして広く知られるジョーダン・フィッシュは、11月8日金曜日にPump.fun経由で発行されたソラナ(SOL)ミームコインの供給量の60%を燃やした。

トップ10の仮想通貨トレーディングアプリのうち、トップ10の仮想通貨取引アプリのどれが最も信頼できますか? トップ10の仮想通貨トレーディングアプリのうち、トップ10の仮想通貨取引アプリのどれが最も信頼できますか? Mar 19, 2025 pm 05:00 PM

トップ10仮想通貨取引アプリのランキング:1。OKX、2。Binance、3。Gate.io、4。Kraken、5。Huobi、6。Coinbase、7。Kucoin、8。Crypto.com、9。Bitfinex、10。Gemini。プラットフォームを選択する際には、セキュリティ、流動性、処理料、通貨選択、ユーザーインターフェイス、カスタマーサポートを考慮する必要があります。

OUYI OK Exchangeの公式入り口にログインします OUYI OK Exchangeの公式入り口にログインします Feb 21, 2025 pm 05:33 PM

世界有数の暗号通貨取引プラットフォームの1つであるOUYI Exchangeは、ユーザーに安全で信頼性の高いデジタル資産取引サービスを提供します。その公式ポータル接続は、プラットフォームに直接アクセスでき、資産管理、取引、投資を便利かつ効率的にすることができます。高度なテクノロジーとリスク制御措置を採用することにより、OUYIは安全で安定した取引環境の作成に取り組んでおり、ユーザーは自信を持って取引し、デジタル資産の世界の利便性と利点を享受できます。

ビットコイン購入プラットフォームのランキング(2025年の最新のアップデート) ビットコイン購入プラットフォームのランキング(2025年の最新のアップデート) Feb 21, 2025 pm 07:12 PM

デジタル資産分野では、ビットコインは、非常に期待される暗号通貨として、取引に対する需要が高まっています。この記事では、世界のトップ10のビットコイン取引プラットフォームを探り、包括的なランキングリストを提供し、読者が取引ニーズに最適なプラットフォームを選択するのに役立ちます。

トップ10デジタル仮想通貨取引プラットフォームランキング2025最新 トップ10デジタル仮想通貨取引プラットフォームランキング2025最新 Mar 21, 2025 pm 03:27 PM

2025年のトップ10デジタル仮想通貨取引プラットフォーム:1。OKX、2。Binance、3。Gate.io、4。Kraken、5。HuobiGlobal、6。Coinbase、7。Kucoin、8。Crypto.com、9。Bitfinex、10。MexcGlobal。これらのプラットフォームは、トランザクションのボリューム、ユーザーエクスペリエンス、セキュリティ、通貨の豊富さにより、最適なものとして選択されました。

See all articles