首页 > 其他分享 >[转]CryptoJS-中文文档

[转]CryptoJS-中文文档

时间:2023-12-21 15:34:51浏览次数:35  
标签:中文 enc Secret 文档 Passphrase var Message CryptoJS

原文地址:CryptoJS-中文文档 - 掘金

原始文档:code.google.com/archive/p/c…

介绍

CryptoJS是一个JavaScript的加解密的工具包。它支持多种算法:MD5、SHA1、SHA2、SHA3、RIPEMD-160 的哈希散列,以及进行 AES、DES、Rabbit、RC4、Triple DES 加解密。

散列算法

MD5

MD5是一种广泛使用的散列函数。它被用于各种安全应用,也通常用于校验文件的完整性。但MD5不耐碰撞攻击,因此不适用于SSL证书或数字签名。

  ini 复制代码
var hash = CryptoJS.MD5("Message");

SHA-1

SHA 散列函数由美国国家安全局 (NSA) 设计。SHA-1 是现有 SHA 散列函数中最成熟的,它用于各种安全应用程序和协议。但随着新攻击的发现或改进,SHA-1 的抗攻击能力一直在减弱。

  ini 复制代码
var hash = CryptoJS.SHA1("Message");

SHA-2

SHA-224、SHA-256、SHA-384,和SHA-512合称为SHA-2SHA-256SHA-2集合中的四个变体之一。虽然它提供了更好的安全性,但是它的应用不如SHA-1广泛。

  ini 复制代码
var hash = CryptoJS.SHA256("Message");

SHA-512在很大程度上与SHA-256相同,但在64位计算机上SHA-512SHA-256更快(因为它们在内部使用64位算术);在8位,16位和32位计算机上,SHA-256SHA-512更快。

  ini 复制代码
var hash = CryptoJS.SHA512("Message");

CryptoJS还支持SHA-224SHA-384,这两个版本大致相同,分别是SHA-256SHA-512的删减版本。

SHA-3

SHA-3是第三代安全散列算法(Secure Hash Algorithm 3)

  ini 复制代码
var hash = CryptoJS.SHA3("Message");

SHA-3可以配置输出散列长度为224,256,384或512位,默认为512位。

  ini 复制代码
var hash = CryptoJS.SHA3("Message", { outputLength: 512 });
var hash = CryptoJS.SHA3("Message", { outputLength: 384 });
var hash = CryptoJS.SHA3("Message", { outputLength: 256 });
var hash = CryptoJS.SHA3("Message", { outputLength: 224 });

RIPEMD-160

  ini 复制代码
var hash = CryptoJS.RIPEMD160("Message");

散列输入

散列算法接受输入字符串或WordArray实例。WordArray对象表示一个32位“单词数组”。当你传入一个字符串时,它会自动转换为编码为UTF-8WordArray

散列输出

返回的散列不是字符串,它是一个WordArray对象。当您在字符串上下文中使用WordArray对象时,它会自动转换为十六进制字符串。

  bash 复制代码
var hash = CryptoJS.SHA256("Message");

typeof hash
> "object";

hash
> "2f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91";

使用toString方法并传入编码格式,可以将WordArray对象转换为其他编码格式

  vbscript 复制代码
var hash = CryptoJS.SHA256("Message")

hash.toString(CryptoJS.enc.Base64)
> "L3dmip37+NWEi57rSnFFypTG7ZI25Kdz9tyvpRMrL5E=";

hash.toString(CryptoJS.enc.Hex)
> "2f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91";

渐进式散列

  ini 复制代码
var sha256 = CryptoJS.algo.SHA256.create();
sha256.update("Message Part 1");
sha256.update("Message Part 2");
sha256.update("Message Part 3");

var hash = sha256.finalize();

HMAC

HMAC是一种使用加密散列函数进行消息认证的机制,可以与任何迭代密码散列函数结合使用。

  ini 复制代码
var hash = CryptoJS.HmacMD5("Message", "Secret Passphrase");
var hash = CryptoJS.HmacSHA1("Message", "Secret Passphrase");
var hash = CryptoJS.HmacSHA256("Message", "Secret Passphrase");
var hash = CryptoJS.HmacSHA512("Message", "Secret Passphrase");

渐进式HMAC散列

  ini 复制代码
var hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, "Secret Passphrase");
hmac.update("Message Part 1");
hmac.update("Message Part 2");
hmac.update("Message Part 3");

var hash = hmac.finalize();

PBKDF2

PBKDF2是一个用来对用户口令(password)进行加密的函数。在密码学的许多应用中,用户安全性最终取决于用户口令,由于用户口令通常不能直接用作密钥,因此需要进行一些处理。

它的基本原理是通过一个伪随机函数(例如HMAC函数),把明文和一个盐值作为输入参数,,生成一个散列值,然后将这个散列值作为一个加密key,应用到后续的加密过程中,以此类推,将这个过程重复很多次,从而增加了密码破解的难度,这个过程也被称为是密码加强。如果重复的次数足够大,破解的成本就会变得很高。

  • Salt 表示盐值,一个随机数
  • iterations 操作次数
  ini 复制代码
var salt = CryptoJS.lib.WordArray.random(128 / 8);
var key128Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, {
  keySize: 128 / 32
});
var key256Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, {
  keySize: 256 / 32
});
var key512Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, {
  keySize: 512 / 32
});
var key512Bits1000Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, {
  keySize: 512 / 32,
  iterations: 1000
});

加密

加密算法

加密函数的参数是:(明文字符串, 密钥字符串,可选参数对象),返回密文字符串。 加密函数是:Cryptojs.AES.encryptCryptojs.DES.encrypt``,Cryptojs.Rabbit.encryptCryptojs.RC4.encryptCryptojs.TripleDES.encrypt

解密函数的参数是:(密文字符串, 密钥字符串,可选参数对象),返回的结果必须用.toString(CryptoJS.enc.Utf8)转为明文。 解密函数是:CryptoJS.AES.decryptCryptoJS.DES.decryptCryptoJS.Rabbit.decryptCryptoJS.RC4.decryptCryptoJS.TripleDES.decrypt

其中可选参数对象常用属性:

  • mode:加密模式 【CBC ECB CFB OFB CTRGladman(CTR)】
  • paddig:填充方式 【 NoPadding ZeroPadding Pkcs7(Pkcs5) Iso10126 Iso97971 AnsiX923】
  • vi: 偏移向量
  • formatter:自定义格式

AES

AES 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。

  ini 复制代码
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");

var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");

CryptoJS支持AES-128、AES-192AES-256。密钥的长度决定了AES加密的轮数。

DES,三重DES

DES是以前比较重要的加密算法,但由于密钥长度太短,安全性不够。

  ini 复制代码
var encrypted = CryptoJS.DES.encrypt("Message", "Secret Passphrase");

var decrypted = CryptoJS.DES.decrypt(encrypted, "Secret Passphrase");

三重DES是为了增加DES的强度,将DES重复3次所得到的一种密码算法,具有足够的安全性。

  ini 复制代码
var encrypted = CryptoJS.TripleDES.encrypt("Message", "Secret Passphrase");

var decrypted = CryptoJS.TripleDES.decrypt(encrypted, "Secret Passphrase");

Rabbit

Rabbit 是一种高速流密码,于 2003 年在 FSE 研讨会上首次提出。 Rabbit 使用一个 128 位密钥和一个 64 位初始化向量。 该加密算法的核心组件是一个位流生成器,该流生成器每次迭代都会加密 128 个消息位。

  ini 复制代码
var encrypted = CryptoJS.Rabbit.encrypt("Message", "Secret Passphrase");

var decrypted = CryptoJS.Rabbit.decrypt(encrypted, "Secret Passphrase");

RC4, RC4Drop

RC4算法是Ron RivestRSA公司在1987年设计的一种流密码,作为RSA的商业机密直到1994年才被匿名公布于InternetRC4被用于为网络浏览器和服务器间通信而制定的SSL/TLS(安全套接字协议/传输层安全协议)标准中,以及作为IEEE 801.11无线局域网标准一部分的WEP(Wired Equivalent Privacy)协议和新的WiFi受保护访问协议(WAP)中。从这些应用来看,RC4构成了当今网络通信的非常重要的部分,因此这个算法非常重要。

  ini 复制代码
var encrypted = CryptoJS.RC4.encrypt("Message", "Secret Passphrase");

var decrypted = CryptoJS.RC4.decrypt(encrypted, "Secret Passphrase");

后来研究者发现,密钥流初始的若干字节有偏移问题,泄露了密钥信息,被很多用户弃用。当然,我们可以通过丢弃密钥流的初始若干字节来防御这种攻击,这种改进的算法也被称为RC4-dropRC4-drop可以用drop属性设置丢弃字节值。

  ini 复制代码
var encrypted = CryptoJS.RC4Drop.encrypt("Message", "Secret Passphrase");

var encrypted = CryptoJS.RC4Drop.encrypt("Message", "Secret Passphrase", {
  drop: 3072 / 4
});

var decrypted = CryptoJS.RC4Drop.decrypt(encrypted, "Secret Passphrase", {
  drop: 3072 / 4
});

设置密钥(key)和偏移量(iv)

  ini 复制代码
var key = CryptoJS.enc.Hex.parse("000102030405060708090a0b0c0d0e0f");

var iv = CryptoJS.enc.Hex.parse("101112131415161718191a1b1c1d1e1f");

var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });

加密模式和填充方式

  ini 复制代码
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase", {
  mode: CryptoJS.mode.CFB,
  padding: CryptoJS.pad.AnsiX923
});

CryptoJS支持以下加密模式:

  • CBC (the default)
  • CFB
  • CTR
  • OFB
  • ECB

CryptoJS支持以下填充方式:

  • Pkcs7 (the default)
  • Iso97971
  • AnsiX923
  • Iso10126
  • ZeroPadding
  • NoPadding

加密输入

对于明文消息,加密算法接受输入字符串或CryptoJS.lib.WordArray实例。

对于密钥key,当您输入一个字符串时,它将用于生成密钥和IV。您可以输入实际密钥的WordArray对象和实际的IV

对于密文,密码算法接受输入字符串或CryptoJS.lib.CipherParams的实例。CipherParams对象表示一组参数,如IV、salt和原始密文本身。当您输入字符串时,它会根据可配置的格式策略自动转换为CipherParams对象。

加密输出

解密后得到的明文是一个WordArray对象。详见散列的输出。

加密后得到的密文不是字符串,它是一个CipherParams对象。通过CipherParams对象,您可以拿到加密期间使用的所有参数。当您在字符串上下文中使用CipherParams对象时,它会根据格式策略自动转换为字符串。默认是openssl兼容的格式。

  ini 复制代码
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");

encrypted.key
> "74eb593087a982e2a6f5dded54ecd96d1fd0f3d44a58728cdcd40c55227522223 ";

encrypted.iv
> "7781157e2629b094f0e3dd48c4d786115";

encrypted.salt
> "7a25f9132ec6a8b34";

encrypted.ciphertext
> "73e54154a15d1beeb509d9e12f1e462a0";

encrypted
> "U2FsdGVkX1+iX5Ey7GqLND5UFUoV0b7rUJ2eEvHkYqA=";

您可以定义自己的格式,以便与其他加密实现兼容。format有两个对象方法stringifyparse,在CipherParams对象和密文字符串之间进行转换。 下面是编写JSON格式化的方法:

  ini 复制代码
var JsonFormatter = {
  stringify: function(cipherParams) {
    // 创建ciphertext对象
    var jsonObj = { ct: cipherParams.ciphertext.toString(CryptoJS.enc.Base64) };

    //可选添加 iv 和 salt
    if (cipherParams.iv) {
      jsonObj.iv = cipherParams.iv.toString();
    }

    if (cipherParams.salt) {
      jsonObj.s = cipherParams.salt.toString();
    }

    // 转换成json字符串
    return JSON.stringify(jsonObj);
  },
  parse: function(jsonStr) {
    // 转换成json格式
    var jsonObj = JSON.parse(jsonStr);

    // extract ciphertext from json object, and create cipher params object
    var cipherParams = CryptoJS.lib.CipherParams.create({
      ciphertext: CryptoJS.enc.Base64.parse(jsonObj.ct)
    });

    // 可选提取 iv 和 salt

    if (jsonObj.iv) {
      cipherParams.iv = CryptoJS.enc.Hex.parse(jsonObj.iv);
    }

    if (jsonObj.s) {
      cipherParams.salt = CryptoJS.enc.Hex.parse(jsonObj.s);
    }

    return cipherParams;
  }
};

var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase", {
  format: JsonFormatter
});

encrypted
> {
    ct: "tZ4MsEnfbcDOwqau68aOrQ==",
    iv: "8a8c8fd8fe33743d3638737ea4a00698",
    s: "ba06373c8f57179c"
  };

var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase", {
  format: JsonFormatter
});

decrypted.toString(CryptoJS.enc.Utf8)
> "Message";

渐进式加密

  ini 复制代码
var key = CryptoJS.enc.Hex.parse("000102030405060708090a0b0c0d0e0f");
var iv = CryptoJS.enc.Hex.parse("101112131415161718191a1b1c1d1e1f");

// encrypt加密
var aesEncryptor = CryptoJS.algo.AES.createEncryptor(key, { iv: iv });

var ciphertextPart1 = aesEncryptor.process("Message Part 1");
var ciphertextPart2 = aesEncryptor.process("Message Part 2");
var ciphertextPart3 = aesEncryptor.process("Message Part 3");
var ciphertextPart4 = aesEncryptor.finalize();

// decrypt解密
var aesDecryptor = CryptoJS.algo.AES.createDecryptor(key, { iv: iv });

var plaintextPart1 = aesDecryptor.process(ciphertextPart1);
var plaintextPart2 = aesDecryptor.process(ciphertextPart2);
var plaintextPart3 = aesDecryptor.process(ciphertextPart3);
var plaintextPart4 = aesDecryptor.process(ciphertextPart4);
var plaintextPart5 = aesDecryptor.finalize();

可行性操作

使用OpenSSL加密拿到openSSLEncrypted:

  python 复制代码
openssl enc -aes-256-cbc -in infile -out outfile -pass pass:"Secret Passphrase" -e -base64

使用CryptoJS解密:

  ini 复制代码
var decrypted = CryptoJS.AES.decrypt(openSSLEncrypted, "Secret Passphrase");

编码器

CryptoJS可以将Base64、Latin1或Hex等编码格式转换为WordArray对象,反之亦然。

  ini 复制代码
// Base64字符串 > WordArray对象
var words = CryptoJS.enc.Base64.parse("SGVsbG8sIFdvcmxkIQ==");

​// WordArray对象 > Base64字符串
var base64 = CryptoJS.enc.Base64.stringify(words);

​// Latin1字符串 > WordArray对象
var words = CryptoJS.enc.Latin1.parse("Hello, World!");

// WordArray对象 > Latin1
var latin1 = CryptoJS.enc.Latin1.stringify(words);

​// 16进制 > WordArray对象
var words = CryptoJS.enc.Hex.parse("48656c6c6f2c20576f726c6421");

​​// WordArray对象 > 16进制
var hex = CryptoJS.enc.Hex.stringify(words);

​​// utf8 > WordArray对象
var words = CryptoJS.enc.Utf8.parse("

标签:中文,enc,Secret,文档,Passphrase,var,Message,CryptoJS
From: https://www.cnblogs.com/dirgo/p/17919162.html

相关文章

  • 文档防泄密的基本功能有哪些?
    随着信息技术的发展,文档防泄密已经成为企业信息安全管理的重要组成部分。文档防泄密不仅能保护企业的核心竞争力,也能维护企业的品牌形象和公众信任。那么,文档防泄密的基本功能有哪些呢?本文将从以下几个方面进行阐述。 一、加密功能加密是文档防泄密的重要手段之一。通过对文档......
  • Python编写接口测试文档(以豆瓣搜索为例)
    前言很多人会使用postman工具,或者熟悉python,但不一定会使用python来编写测试用例脚本,postman里面可以完整的将python代码复制出来。(以下所有内容以豆瓣网站搜索功能为例子)一、postman接口用例转换为python测试用例打开postman,点击右侧的</>图标,页面右边会显示脚本,顶部修改导出的语......
  • vue中下载--后端返回的文档流
     实现后端返回的文档流,点击下载<divclass="prom-add"@click="downLoad"><iclass="el-icon-download"></i>下载</div>importrequestfrom'@/router/axios'//下载asyncdownLoad(){letparams={......
  • 界面控件DevExpress WinForms PDF Viewer,让应用轻松显示PDF文档(一)
    DevExpressWinForms的PDFViewer(查看器)控件使用户可以轻松地在Windows应用程序中直接显示PDF文档,而无需在最终用户的机器上安装外部PDF阅读器。DevExpressWinForms有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于使用的应......
  • 边做笔试边查缺补漏——算法、js基础、vue3官方文档、八股文
    边投简历边完善自己的知识库。最近这些天一直在面试和笔试+投简历中,每次面试或笔试完后其实最重要的不是结果,而是做题的过程或者说对话的过程。因为只有这些才让我知道自己哪里还有不足,比如一碰到算法题就歇菜、vue3和vue2混用、js基础知识不牢固等等。那我痛定思痛,有缺点咱就认......
  • C语言中文网
    关于C语言中文网」C语言中文网,一个在线学习编程的网站。它始于C语言,但不终于C语言,除了C语言,您还可以学习C++、Java、Python、Golang、PHP、Linux等其它技能,请「猛击这里」查看所有教程。C语言中文网成立于2012年初,由站长「严长生」在大三寒假期间创办,致力于分享优质编程教程,......
  • springboot051医院管理系统-计算机毕业设计源码+LW文档
    一、立题依据(研究的目的与意义及国内外现状):现如今,互联网的广泛普及与应用,标志着信息化的时代已经到来,管理信息化行业在生活中占据着越来越重要的地位,信息化的服务与管理,大大简化了传统的管理模式,很大程度上,改善了使得人们的生活水平和工作方式。简单的来说医院管理信息化的形式非......
  • springboot053宠物咖啡馆平台-计算机毕业设计源码+LW文档
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于SpringBoot的宠物咖啡馆平台的设计与实现的开发全过程。通过分析基于SpringBoot的宠物咖啡馆平台的设计与实现管理的不足,创建了一个计算机管理基于SpringBoot的宠物咖啡馆......
  • springboot054飘香水果购物网站 -计算机毕业设计源码+LW文档
    摘要随着信息互联网购物的飞速发展,一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了飘香水果购物网站的开发全过程。通过分析企业对于飘香水果购物网站的需求,创建了一个计算机管理飘香水果购物网站的方案。文章介绍了飘香水果购物网站的系统分析部分,包括可行性分......
  • springboot055服装生产管理-计算机毕业设计源码+LW文档
    一、现状、意义和目的1.背景与现状近年来,随着经济全球化与科技管理信息化的协同发展,而又因服装业所面对的是终端消费者市场,是由消费者主导的供应链,服装需求更加多样化,致使服装市场的竞争日趋激烈。随之产品生命周期变短,消费者数量的不断增多及需求快速多变等特性导致服装需求激增,协......