首頁 >web前端 >js教程 >JavaScript 中的密碼學:實用指南

JavaScript 中的密碼學:實用指南

Patricia Arquette
Patricia Arquette原創
2024-12-05 06:25:17258瀏覽

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. 非對稱加密

要建立安全的加密系統,非對稱加密通常是解決方案。它使用兩個金鑰:公鑰用於加密,私鑰用於解密。此設定無需共用單一金鑰即可實現安全通訊。

它是如何運作的

  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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn