JavaScript の暗号化: 実践ガイド

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-05 06:25:17255ブラウズ

Cryptography in JavaScript: A Practical Guide

暗号化は、対象の受信者だけが理解できる形式にデータを変換することでデータを保護します。これは、パスワード、オンライン取引、機密通信を保護するために不可欠です。以下では、暗号化、ハッシュ、およびそれらを実装するための JavaScript の使用について学習します。


暗号化とは何ですか?

暗号化は、読み取り可能なデータ (平文) を読み取り不可能な形式 (暗号文) に変換します。承認された当事者のみがプロセスを元に戻すことができます。

主要な概念:

  • 暗号化: 平文を暗号文に変換します。
  • 復号化: キーを使用して暗号文を平文に戻します。

暗号化の種類

1. 対称暗号化

暗号化と復号化に同じキーを使用します。キーは送信者と受信者の間で安全に共有される必要があります。 AES は、データを読み取り不可能な形式に変換することでデータを保護する、広く使用されているタイプの対称暗号化アルゴリズムです。秘密キーに依存し、128、192、または 256 ビットのキー長をサポートし、不正アクセスに対する強力な保護を提供します。 AES は次の場合に不可欠です:

  • インターネット通信の保護: HTTPS などのオンライン通信を保護します。
  • 機密データの保護: 保管および送信における機密性を確保します。
  • ファイルの暗号化: 個人情報と職業情報を安全に保ちます。

AES の重要な要素

AES の主要な要素には、キー初期化ベクトル (IV) が含まれます。キーは当事者間で共有される秘密の値であり、データの暗号化と復号化の方法を決定するものであり、常に機密性を保つ必要があります。 IV はキーと一緒に使用されるランダムな値で、同一の平文が異なる暗号文に暗号化されることを保証し、パターン認識を防ぐためにランダム性を追加します。 IV は公開できますが、同じキーを使用して再利用してはなりません。これらの要素を組み合わせることで、AES はサイバー脅威に効果的に対抗できるようになり、データ セキュリティの基礎となります。

例: AES (高度暗号化標準)

AES は、共有キーと初期化ベクトル (IV) を使用してデータを暗号化し、ランダム性を高めます。

const crypto = require('crypto');

const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt(text) {
  const cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') };
}

function decrypt(encrypted, ivHex, keyHex) {
  const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex'));
  let decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

// Usage
const message = "Secret Message";
const encryptedData = encrypt(message);
console.log("Encrypted:", encryptedData);

const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key);
console.log("Decrypted:", decryptedMessage);


2. 非対称暗号化

安全な暗号化システムを作成するには、多くの場合、非対称暗号化が解決策となります。暗号化には 公開鍵 、復号化には 秘密鍵 の 2 つの鍵が使用されます。この設定により、単一のキーを共有せずに安全な通信が可能になります。

仕組み

  1. キーペアの生成

    公開鍵と秘密鍵のペアが生成されます。公開キーはオープンに共有されますが、秘密キーは機密のままです。

  2. 暗号化

    受信者の公開キーによってデータが暗号化されます。秘密キーのみが暗号化を解除できるため、たとえ傍受されたとしてもデータは安全に保たれます。

  3. 復号化

    受信者は秘密キーを使用してデータを復号化します。

const crypto = require('crypto');

const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt(text) {
  const cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') };
}

function decrypt(encrypted, ivHex, keyHex) {
  const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex'));
  let decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

// Usage
const message = "Secret Message";
const encryptedData = encrypt(message);
console.log("Encrypted:", encryptedData);

const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key);
console.log("Decrypted:", decryptedMessage);


暗号化におけるハッシュ化

ハッシュ化は、データを固定長の不可逆文字列 (ハッシュ) に変換します。これは、データの整合性を検証し、パスワードを安全に保存するために一般的に使用されます。

一般的なハッシュ アルゴリズム:

  • SHA-256: 安全で広く使用されています。
  • SHA-3: セキュリティが強化された新しいもの。
  • MD5 および SHA-1: 脆弱性のため非推奨になりました。

Node.js での文字列のハッシュ化の例

const crypto = require('crypto');

// Generate keys
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 });

const data = "Confidential Data";

// Encrypt
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(data));
console.log("Encrypted:", encrypted.toString('base64'));

// Decrypt
const decrypted = crypto.privateDecrypt(privateKey, encrypted);
console.log("Decrypted:", decrypted.toString());


暗号化とハッシュ化

機能 暗号化 ハッシュ
Feature Encryption Hashing
Process Two-way (encrypt/decrypt) One-way
Purpose Data confidentiality Data integrity
Reversible Yes No
Example AES, RSA SHA-256, bcrypt
プロセス 双方向 (暗号化/復号化) 片道 目的 データの機密性 データの整合性 リバーシブル はい いいえ 例 AES、RSA SHA-256、bcrypt テーブル>

実践例: プロジェクトにおける非対称暗号化

私のプロジェクト Whisper では、非対称暗号化を使用して匿名チャット メッセージを保護しました。メッセージは受信者の公開キーで暗号化され、受信者だけが秘密キーを使用してメッセージを復号化できるようになります。

クライアント側の React 実装では、暗号化と復号化に crypto-js を使用しました。

const crypto = require('crypto');

const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt(text) {
  const cipher = crypto.createCipheriv(algorithm, key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') };
}

function decrypt(encrypted, ivHex, keyHex) {
  const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex'));
  let decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

// Usage
const message = "Secret Message";
const encryptedData = encrypt(message);
console.log("Encrypted:", encryptedData);

const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key);
console.log("Decrypted:", decryptedMessage);

復号化には秘密キーが使用されます:

const crypto = require('crypto');

// Generate keys
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 });

const data = "Confidential Data";

// Encrypt
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(data));
console.log("Encrypted:", encrypted.toString('base64'));

// Decrypt
const decrypted = crypto.privateDecrypt(privateKey, encrypted);
console.log("Decrypted:", decrypted.toString());

詳細な例については、Whisper のコードを参照してください。


結論

暗号化により、アプリケーションのデータ セキュリティが強化されます。共有キーのシナリオには AES などの対称暗号化を使用し、公開/秘密キー システムには非対称暗号化を使用します。ハッシュにより、特にパスワードのデータの整合性が保証されます。アプリケーションのニーズに基づいて、適切な暗号化アプローチを選択してください。

さらに知識が必要ですか?

共有キーの詳細を読む
公開鍵について詳しく読む
SHA-256
について詳しく読む SHA-3
について詳しく読む MD5 について詳しく読む
SHA-1 について詳しく読む
対称暗号化について詳しく読む
AES について詳しく読む

読んでいただきありがとうございます。これについてどう思うか教えてください。もっと知りたい場合、私が間違っていたり、何かを見逃していると思われる場合は、遠慮なくコメントしてください

以上がJavaScript の暗号化: 実践ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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