首页 > web前端 > js教程 > JavaScript 中的密码学:实用指南

JavaScript 中的密码学:实用指南

Patricia Arquette
发布: 2024-12-05 06:25:17
原创
159 人浏览过

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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板