window属性:crypto

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

属性和方法

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

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

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

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

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

// 异步生成一个加密密钥
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 进行签名和验证签名 

// 异步生成一个签名密钥
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、加密解密、签名验证等。

使用 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
npm install node-forge
使用 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-browserify 或 node-crypto(之前称为 crypto

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

安装 crypto-browserify

npm install crypto-browserify
使用 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)集成良好,可以用于实现安全的数据存储和通信。

 劣势

  1. 浏览器限制

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

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

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

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

    • 尽管大多数现代浏览器都支持 window.crypto,但一些非常旧的浏览器可能不支持,这可能需要 polyfills 或降级方案。

window.crypto 在日常开发中的使用场景包括但不限于:

  1. 安全通信

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

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

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

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

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

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

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

END. 

经常看到有人要找AES-GCM-128  这个算法加解密 网上相关的文档也较少其中在telegram登录首页就在使用该算法 应该让不少哥们头疼 其实这个加密常见于浏览器内置接口window.crypto.subtle 该接口不仅支持该类型的加密 且支持非常多的算法加密如RSA DES  等等  这里就演示AES-GCM-128 这个类型 crypto-AES-GCM-128调用例子 function ___crypto__test(keyData, iv, data) {     const format = "raw",         // keyData = new Uint8Array([23, 113, 57, 6, 35, -69, -60, 98, 84, -17, -125, -49, 18, 6, -92, 32]),         algorithm = "AES-GCM",         extractable = true,         usages = ["encrypt", "decrypt"];     // iv = new Uint8Array([47, 46, 123, 78, 36, 14, 109, 50, 121, 64, 11, 38]);     window.crypto.subtle.importKey(         format,         keyData,         algorithm,         extractable, usages     ).then(key =gt; {         window.crypto.subtle.encrypt({                 name: algorithm,                 iv: iv             },             key,             data         ).then(result =gt; {             console.log(Array.from(new Uint8Array((result))))         })     }) } console.log(___crypto__test(             new Uint8Array([23, 113, 57, 6, 35, -69, -60, 98, 84, -17, -125, -49, 18, 6, -92, 32]),                 new Uint8Array([47, 46, 123, 78, 36, 14, 109, 50, 121, 64, 11, 38]),             new Uint8Array([50, 49, 48]) )) crypto主要相关接口介绍 crypto.subtle.importKey const result = crypto.subtle.importKey(     format,     keyData,     algorithm,     extractable,     usages ); format  是一个字符串,描述要导入的密钥的数据格式。可以是以下之一:----------raw:原始格式。----------pkcs8:PKCS#8格式。----------spki:SubjectPublicKeyInfo格式。----------jwk:JSON Web密钥格式。 - keyData 是ArrayBuffer,TypedArray,a DataView或JSONWebKey包含给定格式的键的对象。 - algorithm  是一个字典对象,用于定义要导入的密钥的类型并提供额外的算法特定参数。对于RSASSA-PKCS1-v1_5,  RSA-PSS或  RSA-OAEP:传递RsaHashedImportParams对象。对于ECDSA或ECDH:传递  EcKeyImportParams对象。对于HMAC:传递一个HmacImportParams对象。对于AES-CTR,AES-CBC,AES-GCM或AES-KW:传递标识算法的字符串或形式为的对象{ "name": ALGORITHM },其中ALGORITHM 是算法的名称。对于PBKDF2  :传递字符串PBKDF2。 - extractable 是Boolean表明它是否将有可能使用到导出密钥SubtleCrypto.exportKey()或SubtleCrypto.wrapKey()。 - ke
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

**之火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值