window属性:crypto

window.crypto 是 Web Crypto API 的一部分,它提供了一个接口来访问基本的加密操作,包括生成加密密钥、签名、验证签名、加密和解密数据等。这个 API 旨在为 Web 应用提供一个安全的方式来处理加密任务,而不需要依赖第三方库。

属性和方法

window.crypto 对象包含以下主要的属性和方法:

  • crypto.subtle:提供了一组异步的加密操作,如加密、解密、签名和验证签名等。
  • crypto.getRandomValues():用于生成加密安全的随机值。

1. 生成加密安全的随机值

javascript 复制代码
// 生成一个 256 位的随机数组
const array = new Uint8Array(256 / 8);
window.crypto.getRandomValues(array);
console.log(array);

2. 使用 crypto.subtle 进行加密和解密

javascript 复制代码
// 异步生成一个加密密钥
window.crypto.subtle.generateKey(
  {
    name: "AES-GCM",
    length: 256
  },
  true,
  ["encrypt", "decrypt"]
).then(key => {
  // 使用密钥加密数据
  const data = new TextEncoder().encode("Hello World");
  window.crypto.subtle.encrypt(
    {
      name: "AES-GCM",
      iv: window.crypto.getRandomValues(new Uint8Array(12))
    },
    key,
    data
  ).then(encrypted => {
    // 异步解密数据
    window.crypto.subtle.decrypt(
      {
        name: "AES-GCM",
        iv: new Uint8Array(12) // 需要与加密时的 IV 相同
      },
      key,
      encrypted
    ).then(decrypted => {
      const dec = new TextDecoder().decode(decrypted);
      console.log(dec); // 输出:Hello World
    });
  });
});

3. 使用 crypto.subtle 进行签名和验证签名

javascript 复制代码
// 异步生成一个签名密钥
window.crypto.subtle.generateKey(
  {
    name: "RSASSA-PKCS1-v1_5",
    modulusLength: 2048,
    publicExponent: new Uint8Array([1, 0, 1]),
    hash: {name: "SHA-256"}
  },
  true,
  ["sign", "verify"]
).then(keyPair => {
  const data = new TextEncoder().encode("Hello World");
  // 签名数据
  window.crypto.subtle.sign(
    "RSASSA-PKCS1-v1_5",
    keyPair.privateKey,
    data
  ).then(signature => {
    // 验证签名
    window.crypto.subtle.verify(
      "RSASSA-PKCS1-v1_5",
      keyPair.publicKey,
      signature,
      data
    ).then(isVerified => {
      console.log(isVerified); // 输出:true
    });
  });
});

Web Crypto API 在 Node.js 中如何使用

要在 Node.js 中使用类似于 Web Crypto API 的功能,你可以使用以下替代方案:

1. crypto 模块

Node.js 自带了一个名为 crypto 的核心模块,它提供了加密功能,包括哈希、HMAC、加密解密、签名验证等。

javascript 复制代码
使用 crypto 模块进行加密和解密
const crypto = require('crypto');

// 加密
function encrypt(text) {
  const cipher = crypto.createCipher('aes-256-cbc', 'secret-key');
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return encrypted;
}

// 解密
function decrypt(encrypted) {
  const decipher = crypto.createDecipher('aes-256-cbc', 'secret-key');
  let decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

const originalText = 'Hello, world!';
const encryptedText = encrypt(originalText);
const decryptedText = decrypt(encryptedText);

console.log(`Original: ${originalText}`);
console.log(`Encrypted: ${encryptedText}`);
console.log(`Decrypted: ${decryptedText}`);
2. node-forge

node-forge 是一个纯 JavaScript 编写的库,提供了许多加密功能,包括 PKI、PSS、OAEP、SHA 系列等。

安装 node-forge
bash 复制代码
npm install node-forge
javascript 复制代码
使用 node-forge 进行签名和验证

const forge = require('node-forge');

// 生成密钥对
const keypair = forge.pki.rsa.generateKeyPair({bits: 1024, e: 0x10001});

// 签名
const md = forge.md.sha256.create();
md.update('Hello, world!', 'utf8');
const signature = keypair.privateKey.sign(md);

// 验证签名
const verified = keypair.publicKey.verify(md.digest().data, signature);
console.log('Signature verified:', verified);
3. crypto-browserifynode-crypto(之前称为 crypto

这些库提供了一个与 Web Crypto API 类似的 API,可以在 Node.js 环境中使用。

安装 crypto-browserify

bash 复制代码
npm install crypto-browserify
javascript 复制代码
使用 crypto-browserify 进行哈希计算

const crypto = require('crypto-browserify');

const hash = crypto.createHash('sha256');
hash.update('Hello, world!');
const result = hash.digest('hex');
console.log(result);

window.crypto 的优势

优势

  1. 安全性

    • 提供了一个安全的随机数生成器,可以生成加密安全的随机值,这对于密码学应用至关重要。
  2. 标准化

    • 作为 Web 标准的一部分,window.crypto 在所有现代浏览器中都有一致的实现,这意味着开发者可以在不同的浏览器和平台上使用相同的代码。
  3. 功能丰富

    • 提供了多种加密算法,包括对称加密(如 AES)和非对称加密(如 RSA、ECDSA),以及哈希函数(如 SHA-256)。
  4. 异步操作

    • 所有加密操作都是异步的,不会阻塞主线程,这对于提高网页性能和用户体验非常重要。
  5. 密钥管理

    • 允许在用户的浏览器中生成和存储加密密钥,而不需要将密钥发送到服务器。
  6. 集成性

    • 与 Web 应用的其他部分(如 IndexedDB、Service Workers)集成良好,可以用于实现安全的数据存储和通信。
      劣势
  7. 浏览器限制

    • 只能在浏览器环境中使用,不适用于 Node.js 或其他非浏览器环境。
  8. 复杂性

    • 对于复杂的加密操作,API 可能显得复杂和难以理解,尤其是对于初学者。
  9. 性能问题

    • 某些加密操作可能比较耗时,尤其是在性能较差的设备上。
  10. 错误处理

    • 错误处理依赖于 Promise,可能不如传统的回调方式直观。
  11. 兼容性

    • 尽管大多数现代浏览器都支持 window.crypto,但一些非常旧的浏览器可能不支持,这可能需要 polyfills 或降级方案。
      window.crypto 在日常开发中的使用场景包括但不限于:
  12. 安全通信

    • 使用 Web Crypto API 加密和解密数据,以保护用户数据的隐私和完整性。
  13. 身份验证

    • 生成和验证数字签名,用于用户身份验证或确保数据的来源。
  14. 密钥交换

    • 使用非对称加密算法安全地交换密钥,为对称加密通信提供基础。
  15. 随机数生成

    • 生成加密安全的随机数,用于密码学应用,如生成安全的密码或密钥。
  16. 本地数据存储

    • 存储加密的数据,如用户凭据或敏感信息,以防止未经授权的访问。
  17. WebAssembly 集成

    • 与 WebAssembly 集成,为高性能的加密操作提供支持。
  18. 区块链和加密货币

    • 实现区块链技术中的加密算法,处理加密货币交易。

END.

相关推荐
_处女座程序员的日常40 分钟前
Rollup failed to resolve import “destr“ from ***/node_modules/pinia-plugin-pers
javascript·uni-app·vue
翔云API2 小时前
PHP开发示例-vin码识别接口-引领汽车行业数字化新风向
开发语言·php
ac-er88882 小时前
如何对PHP的API接口权限认证
开发语言·php
菜鸟、小高2 小时前
从0开始学PHP面向对象内容之(常用魔术方法续一)
开发语言·php
yezipi耶不耶3 小时前
Rust 所有权机制
开发语言·后端·rust
阿征学IT4 小时前
vue 计算属性get set
前端·javascript·vue.js
Amo Xiang4 小时前
2024最新版JavaScript逆向爬虫教程-------基础篇之Chrome开发者工具学习
javascript·chrome·爬虫·js逆向
六月悉茗5 小时前
【C语言 - 简易架构】
c语言·开发语言
凡人的AI工具箱5 小时前
15分钟学 Go 第 49 天 :复杂项目开发
开发语言·人工智能·后端·算法·golang
FFDUST5 小时前
C++ 优先算法 —— 四数之和(双指针)
c语言·开发语言·c++·算法·leetcode·1024程序员节