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. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/915620.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot与Redis的令牌主动失效机制实现

目录 前言1. 项目结构和依赖配置1.1 项目依赖配置1.2 Redis连接配置 2. 令牌主动失效机制的实现流程2.1 登录成功后将令牌存储到Redis中2.2 使用拦截器验证令牌2.3 用户修改密码后删除旧令牌 3. Redis的配置与测试4. 可能的扩展与优化结语 前言 在现代Web系统中,用…

yolov8-cls的onnx与tensorrt推理

本文不生产技术,只做技术的搬运工! 前言 最近需要使用yolov8-cls进行模型分类任务,但是使用ultralytics框架去部署非常不方便,因此打算进行onnx或者tensorrt去部署,查看了很多网上的帖子,并没有发现有完整复现yolov8-cls前处理(不需要后处理)的"轮子",通过自己debug…

Acrobat Pro DC 2023(pdf免费转化word)

所在位置 通过网盘分享的文件:Acrobat Pro DC 2023(64bit).tar 链接: https://pan.baidu.com/s/1_m8TT1rHTtp5YnU8F0QGXQ 提取码: 1234 --来自百度网盘超级会员v4的分享 安装流程 打开安装所在位置 进入安装程序 找到安装程序 进入后点击自定义安装,这里…

VMware和CentOS 7.6 Linux操作系统的安装使用

1. 安装VMware 安装VMware之前,有些电脑是需要去BIOS里修改设置开启cpu虚拟化设备支持才能安装。如果运气不好在安装过程中安装不了的话就自行百度吧。 打开 VMware 的官网: https://www.vmware.com/ 点击 product,往下滑找到 see desktop hypeerviso…

手把手教你:如何从零开始实施一套OA办公系统!

很多朋友都吐槽说公司的各种各样的信息啊文件啊越积越多,导致管理起来越来越麻烦。早就跟大家说过,尤其是在提高工作效率、优化资源配置和促进信息共享方面,OA(办公自动化)系统发挥着不可替代的作用,早安排…

网页web无插件播放器EasyPlayer.js播放器返回错误 Incorrect response MIME type 的解决方式

在使用EasyPlayer.js播放器进行视频流播放时,尤其是在SpringBoot环境中部署静态资源时,可能会遇到“Incorrect response MIME type”的错误,这通常与WebAssembly(WASM)文件的MIME类型配置有关。 WASM是一种新的代码格式…

element-plus <el-date-picker>日期选择器踩坑!!!!

我怎么一上午踩两个坑&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;大声bb&#xff09; 原来的vue2老项目是这样写的 <el-form-item label"时间" prop"time"><el-date-pickerv-model"addForm.time"typ…

# 如何查看 Ubuntu 版本?

如何查看 Ubuntu 版本&#xff1f; 要查看‌Ubuntu版本&#xff0c;你可以通过以下几种方法&#xff1a; 1. 使用‌lsb_release 命令‌查看 使用 lsb_release -a 命令可以查看Ubuntu的详细版本信息&#xff0c;包括发行版ID、版本号以及版本代号。‌ ‌### 2、查看 /etc/is…

常用的生物医药专利查询数据库及网站(很全!)

生物医药专利信息检索是药物研发前期不可或缺的一步&#xff0c;通过对国内外生物医药专利网站信息查询&#xff0c;可详细了解其专利技术&#xff0c;进而有效降低药物研发过程中的风险。 目前主要使用的生物医药专利查询网站分为两大类&#xff0c;一个是免费生物医药专利查询…

第四节-OSI-网络层

数据链路层&#xff1a;二层--MAC地址精确定位 Ethernet 2&#xff1a; 报头长度&#xff1a;18B 携带的参数&#xff1a;D MAC /S MAC/TYPE(标识上层协议)/FCS 802.3 报头长度&#xff1a;26B 携带的参数&#xff1a;D MAC/S MAC/LLC(标识上层协议)/SNAP&#xff08;标识…

Python数据分析NumPy和pandas(二十七、数据可视化 matplotlib API 入门)

数据可视化或者数据绘图是数据分析中最重要的任务之一&#xff0c;是数据探索过程的一部分&#xff0c;数据可视化可以帮助我们识别异常值、识别出需要的数据转换以及为模型生成提供思考依据。对于Web开发人员&#xff0c;构建基于Web的数据可视化显示也是一种重要的方式。Pyth…

【前端】深入浅出 - TypeScript 的详细讲解

TypeScript 是一种静态类型编程语言&#xff0c;它是 JavaScript 的超集&#xff0c;添加了类型系统和编译时检查。TypeScript 的主要目标是提高大型项目的开发效率和可维护性。本文将详细介绍 TypeScript 的核心概念、语法、类型系统、高级特性以及最佳实践。 1. TypeScript…

查询DBA_FREE_SPACE缓慢问题

这个是一个常见的问题&#xff0c;理论上应该也算是一个bug&#xff0c;在oracle10g&#xff0c;到19c&#xff0c;我都曾经遇到过&#xff1b;今天在给两套新建的19C RAC添加监控脚本时&#xff0c;又发现了这个问题&#xff0c;在这里记录一下。 Symptoms 环境&#xff1a;…

The Internals of PostgreSQL 翻译版 持续更新...

为了方便自己快速学习&#xff0c;整理了翻译版本&#xff0c;目前翻译的还不完善&#xff0c;后续会边学习边完善。 文档用于自己快速参考&#xff0c;会持续修正&#xff0c;能力有限,无法确保正确!!! 《The Internals of PostgreSQL 》 不是 《 PostgreSQL14 Internals 》…

机器学习 ---模型评估、选择与验证(1)

目录 前言 一、为什么要有训练集与测试集 1、为什么要有训练集与测试集 2、如何划分训练集与测试集 二、欠拟合与过拟合 1、什么是欠拟合与欠拟合的原因 2、什么是过拟合与过拟合的原因 一些解决模型过拟合和欠拟合问题的常见方法&#xff1a; 解决过拟合问题&#…

一文简单了解Android中的input流程

在 Android 中&#xff0c;输入事件&#xff08;例如触摸、按键&#xff09;从硬件传递到应用程序并最终由应用层消费。整个过程涉及多个系统层次&#xff0c;包括硬件层、Linux 内核、Native 层、Framework 层和应用层。我们将深入解析这一流程&#xff0c;并结合代码逐步了解…

【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题

目录 1. 单例模式 (1) 饿汉模式 (2) 懒汉模式 1. 单线程版本 2. 多线程版本 2. 解决懒汉模式产生的线程安全问题 (1) 产生线程安全的原因 (2) 解决线程安全问题 1. 通过加锁让读写操作紧密执行 方法一 方法二 2. 处理加锁引入的新问题 问题描述 …

二叉树搜索树(下)

二叉树搜索树&#xff08;下&#xff09; 二叉搜索树key和key/value使用场景 key搜索场景 只有key作为关键码&#xff0c;结构中只需要存储key即可&#xff0c;关键码即为需要搜索到的值&#xff0c;搜索场景只需要判断 key在不在。key的搜索场景实现的二叉树搜索树支持增删查…

Web项目版本更新及时通知

背景 单页应用&#xff0c;项目更新时&#xff0c;部分用户会出更新不及时&#xff0c;导致异常的问题。 技术方案 给出版本号&#xff0c;项目每次更新时通知用户&#xff0c;版本已经更新需要刷新页面。 版本号更新方案版本号变更后通知用户哪些用户需要通知&#xff1f;…

D64【python 接口自动化学习】- python基础之数据库

day64 SQL-DQL-基础查询 学习日期&#xff1a;20241110 学习目标&#xff1a;MySQL数据库-- 133 SQL-DQL-基础查询 学习笔记&#xff1a; 基础数据查询 基础数据查询-过滤 总结 基础查询的语法&#xff1a;select 字段列表|* from 表过滤查询的语法&#xff1a;select 字段…