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 のインストール (グラフィカル チュートリアル)

推薦する

docker pruneコマンドは、あまり使用されないデータを定期的にクリーンアップするために使用できます。

目次docker システム df docker システム プルーンNoneオブジェクトをクリーンアッ...

CnBlogs カスタムブログスタイルの共有

半夜かけてようやくブログのスタイルを大体完成させることができました。ブログ全体が青を基調としていて、...

JavaScriptの動作メカニズムの詳細な説明とイベントループについての簡単な説明

目次1. JavaScript がシングルスレッドなのはなぜですか? 2. タスクキュー3. イベン...

Linux で Bash 環境変数を設定する方法

Shell は C 言語で書かれたプログラムであり、ユーザーが Linux を使用するための橋渡しと...

5 分で vue-cli3 を使用してプロジェクトを作成する方法を説明します (初心者向けガイド)

目次1. Vue環境を構築する2. Vue スキャフォールディングツール3. プロジェクトを作成する...

カスタムポップアップボックスを実装するためのJavaScriptシングルトンモード

この記事では、カスタムポップアップボックスを実装するためのJavaScriptシングルトンモードの具...

ReactでのDOM操作の実装

目次前の単語使用シナリオ参照HTML要素クラスコンポーネント機能コンポーネント[DOMノードを親コン...

Element における複数データ読み込み最適化の実装

目次シナリオコードの実装要約:シナリオ最近、ElementUI をベースにしたバックグラウンド管理シ...

非常に実用的なMySQL関数の包括的な概要、詳細な例の分析チュートリアル

目次1. MySQLの関数の説明2. 単行関数の分類3. キャラクター機能4. 数学関数5. 日付と...

Linux サーバーのステータスとパフォーマンスに関連するコマンドの詳細な説明

サーバーステータス分析Linux サーバーの CPU の詳細を表示する#CPU情報を表示[root@...

MySQL インデックスの一般的な問題の概要

Q1: データベースにはどのようなインデックスがありますか?メリットとデメリットは何ですか? 1. ...

Linux 負荷分散 LVS の詳細な理解

目次1. LVS 負荷分散2. 負荷分散LVSの基本紹介3. LVSアーキテクチャ3.1 ロードバラ...

MySQLクエリ構文の概要

序文:この記事では主に、MySQL の where、group by、order by、limit、...

Linuxのwhichコマンドの具体的な使い方

Linux でファイルを見つけたいのに、その場所がわからないことがよくあります。次のコマンドを使用し...

IE6 の select を div でカバーできないバグの解決方法

div を使用してマスクを作成したり、ポップアップ ウィンドウをシミュレートしたりします。ただし、I...