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

推薦する

Mysql systemctl start mysqld によって報告されるエラーの解決策

エラーメッセージ:制御プロセスがエラー コードで終了したため、mysqld.service のジョブ...

HTML フレーム、Iframe、フレームセットの違い

10.4.1 フレームセットとフレームの違い まず、フレームセットとフレームの違いについて説明します...

Vueコンポーネントは、写真やビデオをアップロードするためのサンプルコードをカプセル化します

まず依存関係をダウンロードします: cnpm i -S vue-uuid ali-oss画像フィール...

HTML 形式の JSON 出力の例 (テスト インターフェース)

JSON データを美しいインデント形式で表示するには、最も単純な JSON.stringify 関...

Ubuntu 18仮想マシンのクローン作成後に同じIPアドレスになる問題の解決方法

序文最近、仮想マシンを使用して Ubuntu 18.04 をインストールしました。クローン作成後、I...

nginx keepaliveの具体的な使い方

http1.1 プロトコルのデフォルトのリクエスト ヘッダーでは、図に示すように、デフォルトで ke...

CentOS6.9+Mysql5.7.18 ソースコードのインストール詳細チュートリアル

CentOS6.9+Mysql5.7.18 ソースコードのインストールでは、以下の操作を root ...

HTML CSS の 3 つの一般的なスタイル セレクター

1: タグセレクタータグセレクターはすべてのタグに使用されます。ここでは p を例に挙げます。つまり...

2019 年に最も役立ち重要なオープンソース ツール トップ 10

Black Duck の 2017 年のオープンソース調査では、回答者の 77% がオープンソース...

スローモーションアニメーション効果を実現するJavaScript

この記事では、スローモーションアニメーション効果を実現するためのJavaScriptの具体的なコード...

CSS で複数の境界線を実装するためのヒント

1. 複数の国境[1]背景: ボックスシャドウ、アウトライン使用シナリオの多様性を考慮すると、複数の...

Linux システムでの gcc コマンドの使用法の詳細な説明

目次1. 前処理2. コンパイル3. コンパイル4. リンク1. gccのインストール(Ubuntu...

MYSQLについては、データ型と操作テーブルを知る必要があります

データ型と操作データテーブル1.1 MySQL 型: 整数 1.2 MySQL データ型: 浮動小数...

Docker クロスホストネットワークの実装 (手動)

1. Macvlan の紹介Macvlan が登場する前は、イーサネット カードに複数の IP ア...

ツールキット: Bootstrap よりも強力なフロントエンド フレームワーク

注: 現在、最も人気のフロントエンド フレームワークは Bootstrap と Foundation...