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.

相关推荐
徐小黑ACG19 分钟前
GO语言 使用protobuf
开发语言·后端·golang·protobuf
花花鱼1 小时前
node-modules-inspector 可视化node_modules
前端·javascript·vue.js
0白露1 小时前
Apifox Helper 与 Swagger3 区别
开发语言
Tanecious.2 小时前
机器视觉--python基础语法
开发语言·python
叠叠乐2 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
TDengine (老段)3 小时前
TDengine 中的关联查询
大数据·javascript·网络·物联网·时序数据库·tdengine·iotdb
niandb3 小时前
The Rust Programming Language 学习 (九)
windows·rust
Tttian6224 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
再学一点就睡4 小时前
大文件上传之切片上传以及开发全流程之前端篇
前端·javascript
独好紫罗兰5 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法