IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> crypto.ts 浏览器数据加密解密 -> 正文阅读

[JavaScript知识库]crypto.ts 浏览器数据加密解密

class CryptoHelper {
  constructor(readonly enabled = false) {}
  private key: CryptoKey; // 密钥
  private iv: Uint8Array; // 向量
  /**
   * 将 str 格式的数据转化为 uint8Array
   * @param str
   */
  private stringToUint8Array(str: string): Uint8Array {
    var arr = [];
    for (let i = 0, j = str.length; i < j; i++) {
      arr.push(str.charCodeAt(i));
    }
    return new Uint8Array(arr);
  }
  /** 是否能使用 crypto 进行加密解密 */
  private cryptoSwitch() {
    // 如果是本地测试,只能使用 localhost , 使用 127.0.0.1 或者其他,则 window.crypto.subtle 为 undefined
    return this.enabled && window.crypto.subtle !== undefined;
  }
  /** 生成密钥 */
  async deriveKey(str: string) {
    const rawKey = this.stringToUint8Array(str);
    return window.crypto.subtle.importKey('raw', rawKey, 'AES-GCM', true, [
      'encrypt',
      'decrypt',
    ]);
  }

  /**
   * 根据凭证,生成密钥,向量
   * @param keyToken 密钥凭证,可自定义
   * @param ivToken 向量凭证,可自定义
   */
  public async generateKey(keyToken: string, ivToken: string) {
    if (!this.cryptoSwitch()) return;

    this.key = await this.deriveKey(keyToken);
    this.iv = this.stringToUint8Array(ivToken);
  }
  /** 加密 API */
  private async enCryptoApi(
    ciphertext: string,
    key: CryptoKey,
    iv: Uint8Array
  ) {
    const enc = new TextEncoder();
    const encoded = enc.encode(ciphertext);
    return window.crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, encoded);
  }
  /**解密 API */
  private async deCryptoApi(ciphertext: any, key: CryptoKey, iv: Uint8Array) {
    const decrypted = await window.crypto.subtle.decrypt(
      { name: 'AES-GCM', iv },
      key,
      ciphertext
    );
    const dec = new TextDecoder();
    return dec.decode(decrypted);
  }
  /**
   * 加密
   * @param messageJSON 需要加密的数据
   * @returns
   */
  public async encrypt(messageJSON: string) {
    return this.cryptoSwitch() && messageJSON
      ? this.enCryptoApi(messageJSON, this.key, this.iv)
      : null;
  }
  /**
   * 解密
   * @param messageJSON 经过加密后需要解密的数据
   * @returns
   */
  public async decrypt(messageJSON: any) {
    return this.cryptoSwitch() && messageJSON
      ? this.deCryptoApi(messageJSON, this.key, this.iv)
      : null;
  }
}

const cryptoHelper = new CryptoHelper();
export default cryptoHelper;

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:23:40  更:2022-03-15 22:27:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:39:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码