Nodejs 組み込み暗号化モジュールを使用してピアツーピアの暗号化と復号化を実現する詳細な説明

Nodejs 組み込み暗号化モジュールを使用してピアツーピアの暗号化と復号化を実現する詳細な説明

暗号化と復号化は、通信のセキュリティを確保するための重要な手段です。すでに多くの暗号化アルゴリズムがあり、成熟したソフトウェアパッケージが利用可能です。これにより、アプリケーション開発者の負担が大幅に軽減されます。サードパーティが提供する暗号化および復号化ライブラリを使用するだけで済みます。実際、Node.jsは非常に強力で便利な暗号化および復号化モジュールcryptoを提供しています。単純な暗号化および復号化機能を実装するために、サードパーティのNPMライブラリを使用する必要はありません。結局のところ、暗号化と復号化を使用する目的は、通信のセキュリティを確保することです。非公式のサードパーティライブラリを使用すると、常にバックドアなどが追加される可能性があります。Node.jsに付属のcryptoモジュールを使用すると、暗号化のセキュリティを最大限に高めることができます。

ハッシュ値計算 crypto.Hash

ハッシュ値の計算は通常、データの整合性と正確性を検証するために使用されます。受信したデータが送信したデータとまったく同じであることを確認する必要がある場合、送信データのハッシュ値と受信データのハッシュ値をそれぞれ計算できます。単純な比較では、2 つの同一データのハッシュ値は同じであることがわかります。ハッシュ値を逆にして元のデータを復元することはできないため、データの検証にのみ使用できます。では、Node.js ではどのように使用すればよいのでしょうか?

サンプルコード

const crypto = require('crypto');
const ハッシュ = crypto.createHash('sha256');

hash.update('ハッシュするデータ');
console.log(hash.digest('hex'));
// 印刷:
// 6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50

上記のコードは、公式の Node.js デモ コードからコピーしたものです。文字列またはデータ セットのハッシュ値を計算するという、最も簡単な方法を選択しました。これは最も一般的に使用される方法でもあります。 crypto.Hash によって実装されるハッシュ アルゴリズムは、計算演算子として固定の秘密語 Secret を使用します。Node.js には、これに類似した暗号化クラス crypto.Hmac もありますが、秘密語 Secret を変更できます。

可変ハッシュ計算 crypto.Hmac

サンプルコード

const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', '秘密');

hmac.update('ハッシュするデータ');
console.log(hmac.digest('hex'));
// 印刷:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e

crypto.Hmac の使い方は crypto.Hash と非常に似ています。唯一の違いは、カスタマイズ可能な秘密語 Secret が追加されていることです。カスタマイズされた秘密語 Secret を使用する目的の 1 つは、パスワードを保存する際のセキュリティを向上させることです。結局のところ、デフォルトの秘密語 Secret のハッシュ アルゴリズム関数を使用すると、どのようなアルゴリズムが使用されているかを知っていれば、ブルート フォース衝突によってパスワードを取得できます。ただし、カスタマイズされた秘密語 Secret でハッシュ関数を使用すると、徹底的な方法を使用しても解読することはほぼ不可能です。

対称暗号化と復号化

対称暗号化と復号化とは、暗号化側と復号側の両方が同じ秘密語 Secret を使用して暗号化と復号化アルゴリズムの操作を実行することを意味します。この暗号化アルゴリズムは公開鍵と秘密鍵を必要とせず、より便利に使用できます。さらに、ハッシュ アルゴリズムとは異なり、対称暗号化と復号化は双方向で可逆的です。

Node.js は多くの対称暗号化アルゴリズムをサポートしていますが、どの暗号化アルゴリズムが使用されるかは、コンピューターにインストールされている OpenSSL によって異なります。Node.js は OpenSSL を呼び出すだけです。これにより、文書内で暗号化アルゴリズムの情報を見つける方法がないという問題が発生します。問題がどこにあるかは後でわかります。

対称暗号化の使用プロセス

暗号化サンプルコード

 const crypto = require('crypto');

 定数アルゴリズム = 'aes-192-cbc';
 const password = 'キーを生成するために使用されるパスワード';
// 代わりに非同期の `crypto.scrypt()` を使用してください。
 const key = crypto.scryptSync(パスワード、'salt'、24);
// 静的 iv の代わりにランダム iv を生成するには `crypto.randomBytes` を使用します
// ここに表示されています。
 const iv = Buffer.alloc(16, 0); // 初期化ベクトル。

 const cipher = crypto.createCipheriv(アルゴリズム、キー、iv);

 let encrypted = cipher.update('いくつかのクリアテキストデータ', 'utf8', 'hex');
 暗号化 += cipher.final('hex');
 console.log(暗号化済み);
// 印刷: e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa

このコードを段階的に説明しましょう。

定数アルゴリズム = 'aes-192-cbc';

この行は、使用される暗号化アルゴリズムを定義します。通常、中央で - で接続された 3 つの部分で構成されます。最初の部分は暗号化アルゴリズム名 aes、2 番目の部分は暗号化の長さ 192 ビット、3 番目の部分は暗号化認証方法 (この部分は誤解される可能性があります) cbc です。

 const key = crypto.scryptSync(パスワード、'salt'、24);

この行はキーを生成します。最後の数字 24 に注意してください。これは生成されたキーの長さです。最小値は 8 で、最大値の制限はありませんが、8 の倍数である必要があります。キーの長さは、使用する暗号化アルゴリズムに関係します。この情報はドキュメントに含まれていないため、使用時に試行し続けることしかできません。そうしないと、エラーが発生します。

 const iv = Buffer.alloc(16, 0); // 初期化ベクトル。
 const cipher = crypto.createCipheriv(アルゴリズム、キー、iv);

6 行目は初期化ベクトルを作成しますが、これは非常に重要なポイントですが、ドキュメントでは説明されていません。IV の長さも重要です。現在わかっているのは、長さは 8 の倍数である必要があり、長さは使用するアルゴリズムのビット数に関係しているということだけです。ただし、ドキュメントには明確な説明がないため、使用時に試行錯誤するしかありません。

残念なことに、キーと初期化ベクトルの 2 つの主要なパラメータの長さは、Node.js のドキュメントに明確に記載されていません。その結果、それらを使用するときには、暗号化アルゴリズムに関連する情報を調べるか、手動で 1 つずつ試す必要があり、非常に不便です。

 let encrypted = cipher.update('いくつかのクリアテキストデータ', 'utf8', 'hex');
 暗号化 += cipher.final('hex');

この 2 行は非常に単純です。入力文字列を暗号化するだけです。update(...,'utf8', 'hex') では、utf8 は暗号化前の文字列のエンコード形式であり、hex は暗号化後の出力のエンコード形式です。最後に、暗号化された文字列の後に終了文字を追加する必要があります。このタスクは final('hex') によって完了します。Hex は出力の文字エンコード形式でもあります。

対称復号化プロセス

復号化サンプルコード

const crypto = require('crypto');

定数アルゴリズム = 'aes-192-cbc';
const password = 'キーを生成するために使用されるパスワード';
// 代わりに非同期の `crypto.scrypt()` を使用してください。
const key = crypto.scryptSync(パスワード、'salt'、24);
// IV は通常、暗号文とともに渡されます。
const iv = Buffer.alloc(16, 0); // 初期化ベクトル。

const decipher = crypto.createDecipheriv(アルゴリズム、キー、iv);

// 上記は暗号化部分です // 暗号化キーと復号化キーおよび初期化ベクトルは同じである必要があるため // そのため暗号化と復号化が組み合わされます // 同じアルゴリズム、キー、および初期化ベクトルを使用して暗号化されます。
定数暗号化 =
  'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
decrypted = decipher.update(encrypted, 'hex', 'utf8'); とします。
復号化 += decipher.final('utf8');
console.log(復号化済み);
// 印刷: クリアテキストデータ

復号化は暗号化の逆のプロセスであり、注意すべき点は同じです。つまり、キー Key と初期化ベクトルの 2 つのパラメータの長さです。もう 1 つの注意点は、decipher.update 入力の最初のパラメータは Buffer 型ではなく、文字列のみであることです。個人的には、Buffer を使用した方がパフォーマンスが向上するはずだと感じており、将来的にはこのタイプのサポートが追加される可能性があります。

結論

Nodejs の組み込み暗号化モジュールを使用してピアツーピア暗号化と復号化を実装する方法についての記事はこれで終わりです。Nodejs ピアツーピア暗号化と復号化の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • NodeJs の高メモリ使用量のトラブルシューティング実戦記録
  • Node.js の非同期イテレータの詳細な説明
  • Node.js組み込みモジュールの詳細な説明
  • Nodejs モジュール システムのソースコード分析
  • JS と Nodejs におけるイベント駆動型開発についての簡単な説明
  • Nodejs でモジュール fs ファイルシステムを使用する方法
  • Node.js コード実行をバイパスするためのヒントのまとめ
  • Nodejs 探索: シングルスレッドの高並行性の原理を深く理解する
  • Nodejs エラー処理プロセス記録
  • Node.js を使用して C# のデータ テーブル エンティティ クラス生成ツールを作成する方法

<<:  Mac で MySQL バージョン 5.6 のパスワードを設定する方法

>>:  Windows Server 2019 のインストール (グラフィカル チュートリアル)

推薦する

フォームのデフォルトの送信方法を変更する方法

htmlのデフォルトの送信方法は、postではなくgetです。postに変更したい場合は、 meth...

Vue.jsはアイコンをクリックしてズームインし、

前回の記事では、Vue で画像の切り抜きや拡大・縮小、回転を実現する方法を紹介しました。今回は、アイ...

TypeScript における型保護の詳細な説明

目次概要型アサーション構文ではインスタンスオブ構文typeof構文要約する概要TypeScript ...

CSS スタイルで一般的なグラフィック効果を示すサンプルコード

一般的な基本グラフィックと私が遭遇するいくつかの小さなアイコンについて簡単に説明します。以下は CS...

JavaScriptは組み込みオブジェクトのプロトタイプメソッド実装を追加します

オブジェクトがメソッドを呼び出す順序:インスタンス内にメソッドが存在しない場合は、インスタンス オブ...

MySQL DEFINER の使用方法の詳細な説明

目次序文: 1.DEFINERの簡単な紹介2. いくつかの注意点要約:序文: MySQL データベー...

Node.js は、異なるリクエストパスに応じて異なるデータを返します。

目次1. 異なるリクエストパスに応じて異なるデータを返す方法を学びます。 2. 送信データ: データ...

ウェブデザインを改善するための 8 つの CSS ツールを共有する

ウェブサイトのデザインを編集または変更する必要がある場合、CSS が重要な役割を果たします。 CSS...

MySQL で遅いファジークエリを最適化する方法

目次1. はじめに: 2. 最初のアイデアはインデックスを構築することです3. 命令P.S. Lik...

MySQL 8.0 の降順インデックス

序文インデックスが順序付けられていることは誰もが知っていると思いますが、MySQL の以前のバージョ...

HTML ウェブページでのアンカー(名前付きアンカー)の使用の概要

以下の情報はインターネットから収集したものです1. アンカーは、Web ページ作成におけるハイパーリ...

Ajax jQueryはページ上のdivの更新効果を実現します

元のコードは次のとおりです。 <div class='コントロールグループ'&...

MySQL 8.0.13 zipパッケージのインストール方法について

MySQL 8.0.13 にはデフォルトでデータ フォルダがあります。このフォルダを削除する必要があ...

Vueテクノロジーに基づく再帰コンポーネントの実装方法

説明するこの記事では、Vue テクノロジーに基づいて再帰コンポーネントを実装する方法を紹介します。 ...