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

推薦する

SQLのさまざまな結合サマリーの詳細な説明

SQL 左結合、右結合、内部結合、自然結合 さまざまな結合の概要SQL には、左結合、右結合、内部結...

XHTML 入門チュートリアル: テーブルタグの応用

<br />テーブルは XHTML では扱いにくいタグなので、このセクションで理解するだ...

MySQL 8.0 パスワード有効期限ポリシーの詳細な説明

MySQL 8.0.16 以降では、パスワードの有効期限ポリシーを設定できます。今日は、この小さな知...

docker ベースで Prometheus+Grafana を構築する手順の詳細説明

1. プロメテウスの紹介Prometheus は、もともと SoundCloud によって開発された...

CSS flex 複数列レイアウト

基本的な3列レイアウト 。容器{ ディスプレイ: フレックス; 幅: 500ピクセル; 高さ: 20...

HTML/XHTML における img 画像タグの基本的な使用法の詳細な説明

画像タグは、Web ページに画像を表示するために使用されます。 HTML/XHTML 画像 <...

両側にCSS固定レイアウト、中央に適応レイアウトを実装

フローティング、フローティング埋め込み div、配置、フレックスという 4 つの一般的な方法と原則を...

MySQL ストアド プロシージャのエラー処理例の詳細な説明

この記事では、例を使用して MySQL ストアド プロシージャのエラー処理について説明します。ご参考...

Linux でネットワーク パケット損失と遅延をシミュレートする方法

netem と tc: netem は、Linux カーネル バージョン 2.6 以降で提供されるネ...

CSSの優先度を理解する2つの方法

方法1: 値を追加する公式の説明を見るには MDN にアクセスしてください。優先度はどのように計算さ...

Vueモバイル端末の適応化問題の詳細説明

1. vue uiでプロジェクトを作成する 2. 基本設定項目を選択する 3. プロジェクトを実行す...

Linux ソフトウェアのインストール場所を確認する簡単な方法

1. ソフトウェアのインストールパスを確認します。 Linuxソフトウェアをインストールできる場所は...

Vueでaxiosをカプセル化する方法

目次1. インストール1. はじめに3. インターフェースルートアドレス4. 使用例4.1 ダウンロ...

MySQLで大きなテーブルをエレガントに削除する方法について簡単に説明します

目次1. 切り捨て操作1.1 MySQL truncate はどのような操作を実行しますか? 1.2...

SSH経由でローカルLinux仮想マシンに接続するプロセスを記録する

実験環境:物理マシン Windows 10 x64物理NIC情報IPv4 アドレス: 192.168...