js 加密解密 cryptojs(对称加密库)

news2025/1/9 2:13:22

js 加密解密可以使用 crypto-js
这是一个对称加密的库, 可以使用 AES DES 但没有 rsa 等非对称加密的方法
安装方法 npm install crypto-js
它可以进行 MD5 SHA-1 SHA-256 Base64 AES DES 等算法和加密

	import crypto from "crypto-js"
	let md5binary = crypto.MD5("message");
	let hamcmd5binary =crypto.HmacMD5("message");
	//以上两个得到的是一个二进制的数据, 要可打印出业,就要使用 16进制模式或者base64方式
	//crypto 也有应的转换方法

通过显式调用toString方法并传递编码器,可以将WordArray(二进制数据)对象转换为其他格式。

import crypto from "crypto-js"
	 let md5message = cryptjs.MD5(str); //这里得到的都是摘要的 二进制数据
  console.log(md5message);  //打印的二进制数据
  let hmacmd5message = cryptjs.HmacMD5(str,"haha"); //这里得到的都是摘要的 二进制数据
  console.log(hmacmd5message); //打印的二进制数据

  let sha1message = cryptjs.SHA1(str); //这里得到的都是摘要的 二进制数据
  console.log(sha1message); //打印的二进制数据
  let hamcsha1message = cryptjs.HmacSHA1(str,"haha");//这里得到的都是摘要的 二进制数据
  console.log(hamcsha1message); //打印的二进制数据

  let sha512message = cryptjs.SHA512(str); //这里得到的都是摘要的 二进制数据
  console.log(sha512message); //打印的二进制数据
  let hmacsha512message = cryptjs.HmacSHA512(str,"haha");//这里得到的都是摘要的 二进制数据
  console.log(hmacsha512message);//打印的二进制数据

  //上面打印的都是二进制的数据, 不利于传输, 所以, 我们要把它们变成 十六进制数据,或都base64的数据来进行传输
  //通过显式调用toString方法并传递编码器,可以将WordArray(二进制)对象转换为其他格式。

  //转成 base64 格式的方法

  let strbyhex = md5message.toString(cryptjs.enc.Hex);   //把二进制数据转成16进制
  console.log(strbyhex,"|||||||| js 十六进制结果");

  let strbybase64 = md5message.toString(cryptjs.enc.Base64);    //把二进制数据转成base64
  console.log(strbybase64,"||||||||js base64 结果")

我们把最后几行的 二进制转16进制和 二进制转base64 的结果和 php 生成的结果对比一下看看

    public function testpass(){
        $md5binary =  hash("md5","message",true);  //第三个参数 为false  输出的是十六进制数据   如果是true  输出的是二进制数据
        //php 转二进制数据到 十六进制数据
        $md5hex = bin2hex($md5binary);
        //php 二进制数据到base64
        $md5base64 = base64_encode($md5binary);
        echo "php十六进制结果";
        echo $md5hex;
        echo "<br/>";
        echo "php base64结果";
        echo $md5base64;
        }

分别运行代码看结果
在这里插入图片描述
在这里插入图片描述
对比没有问题

对称加密

cryptojs 也可以用来做对称加密,就拿 AES 对称加密来说
AES 对称加密是 需要有 密钥key 向量 iv
CryptoJS支持AES-128、AES-192和AES-256。它会根据你传入的密钥的大小来选择变体。如果你使用密码短语,它会生成一个256位的密钥。
当然, 我们也可以自己来定义 密钥key 和 iv向量
在这之前我们要先了解一下, js base64 16进制 utf8 之前的转换

js php utf8字符串转base64
	let str = "这是一个测式";
  let words = cryptjs.enc.Utf8.parse(str);  //先把字符串转成words数型的二进制数组
  let base64words = cryptjs.enc.Base64.stringify(words);  //把二进制数组转成 base64字符串
  console.log(base64words);  //输出  6L+Z5piv5LiA5Liq5rWL5byP

我们可以用 php base64_encode 来验证一下

 $a = "这是一个测式";
 echo base64_encode($a);   //输出的结果  6L+Z5piv5LiA5Liq5rWL5byP

js php 把base64字符转成 utf8
let baseStr = "6L+Z5piv5LiA5Liq5rWL5byP";
  let wordsbyBase64 = cryptjs.enc.Base64.parse(baseStr);  //把base64字符串转成 words数组(二进制数组)
  let res = cryptjs.enc.Utf8.stringify(wordsbyBase64);
  console.log(res);   //结果 这是一个测式

php base64_decode 来验证

 		$a = "6L+Z5piv5LiA5Liq5rWL5byP";
        echo base64_decode($a);  // 结果 这是一个测式

js php 把utf8 字符串,转成16进制
  let str1 = "这是一个字符串转成十六进制的测试";
  let words16bystr = cryptjs.enc.Utf8.parse(str1);
  let hexstr = cryptjs.enc.Hex.stringify(words16bystr);
  console.log(hexstr);  //得到结果 e8bf99e698afe4b880e4b8aae5ad97e7aca6e4b8b2e8bdace68890e58d81e585ade8bf9be588b6e79a84e6b58be8af95

用 php 来进行验证

        $str = "这是一个字符串转成十六进制的测试";
        $strto16 = bin2hex($str);
        echo $strto16; //结果 e8bf99e698afe4b880e4b8aae5ad97e7aca6e4b8b2e8bdace68890e58d81e585ade8bf9be588b6e79a84e6b58be8af95

此处有点疑问:明明是一个字符串, 为什么php 转换时用的 bin2hex 函数呢,这不应该是二进制数据转hex 才用的函数吗?
后来,我使用 php 的gettype 函数 看了一下,不管是字符串,还是二进制数据, 在php 这里都是string 类型, 也就是说 php 底层是把 字符串当做二进制的数据在处理(这里不知道对不对,感觉是这样的)

   $str = "这是一个字符串转成十六进制的测试";
        echo gettype($str);     // 显示 string
        echo "<br/>";
        //为了得到一个二进制的乱码一样的数据, 我们可以使用 hash函数得到
        //hash 第三个参数如果设为 true ,就可以得到一个二进制数据
        $binary = hash("md5","123456",true);
        echo $binary;  // 显示  � �9I�Y��V�W��>
        echo gettype($binary);  // 显示 string 但这个明显是一些乱码

从上面的例子中, 我们看到 其实 $str 和 $binary 都是一个类型的(string,底层看他们都是二进制数据),那么为什么 一个可以显示正常,一个显示乱码呢,
因为 $str 是我们输入的中文字符, 在字符码表中一定是有想应的编码的,但是 $binary 就是一串无序的二进制数, 有的可能中文码表中根本就没有对应的字符,所以就显示成乱码了
因为有的会显示成乱码, 所以我们在传输的时候,可以使用 base64来传输,把二进制数据转成 base64,传输,不会丢失数据

js php 把16进制数据转成 utf8 字符串
let str2 = "e8bf99e698afe4b880e4b8aae5ad97e7aca6e4b8b2e8bdace68890e58d81e585ade8bf9be588b6e79a84e6b58be8af95";
  let hextowords = cryptjs.enc.Hex.parse(str2);  //把十六进制转成 words (二进制数组)
  let str2back = cryptjs.enc.Utf8.stringify(hextowords);  //把二进制转成utf8
  console.log(str2back);

php 验证

       $hexstr = 'e8bf99e698afe4b880e4b8aae5ad97e7aca6e4b8b2e8bdace68890e58d81e585ade8bf9be588b6e79a84e6b58be8af95';
       $str = hex2bin($hexstr);
       echo $str;


有了上面的基础, 我们下面来做一个例子

由后端php 使用 对称加密,加密一段文字, 然后返回给前端js , 同时要返回 加密的 iv, 然后前端 js 使用 cryptojs 来进行解密, 看是否正确

js AES 加解密

cryptjs.AES.encrypt 参数中的 key 和 iv 都是 以 wordsArray (二进制) 传入的,所以要明白 Utf8.parse 的方法
CryptoJS支持AES-128、AES-192和AES-256。它会根据你传入的密钥的大小来选择变体。
所以 下例中, 我们的 key1 只有16位,所以会自动选用 aes-128

   //加密
  let secretStr = "这是一个测试AES";
  let key1 = cryptjs.enc.Utf8.parse("1234567812345678");  //十六位的
  let encrypted1 = cryptjs.AES.encrypt(secretStr,key1,{
    iv:cryptjs.enc.Utf8.parse("abcdefghijklmnop"),
    mode:cryptjs.mode.CBC,   //aes加密模式cbc  这个参数要前后端一至使用统一的加密模式
    padding:cryptjs.pad.Pkcs7  //使用 Pkcs7的方式填充   //这个php 加密时默认就是这种方式
  });
  console.log(encrypted1);  //加密的结果是一个对象
  console.log(encrypted1.key);  //对象中有 key , iv 等信息
  console.log(cryptjs.enc.Utf8.stringify(encrypted1.key))  //打印出key 的utf8字符串
  console.log(encrypted1.toString())    //使用toString 方法可以得到加密后的字符串
//加密的结果是:  YzXNRYB6/mmevnBiZPLRPu4Knk+qUVNyhUKonAB2Wjg=  这明显是一个base64格式的 
  //解密
  let result = cryptjs.AES.decrypt(encrypted1.toString(),key1,{
    iv:cryptjs.enc.Utf8.parse("abcdefghijklmnop"),
    mode:cryptjs.mode.CBC,
    padding:cryptjs.pad.Pkcs7
  })
  console.log(result);  //解密后得到的是一个 wordArray 二进制的对象
  console.log(cryptjs.enc.Utf8.stringify(result));    //把二进制对象转成 utf8的字符
  //解密的结果是 这是一个测试AES

php AES 加解密

        $str =  "这是一个测试AES";
        $algo = "AES-128-CBC";
        dump(openssl_cipher_iv_length($algo));  //这里我们可以先看一下 AES-128-CBC 的所需要的  iv 长度 结果是16,所以我们自定义了一个iv 是16个字符
        $key = "1234567812345678";
        $iv = "abcdefghijklmnop";
        $encrypt = openssl_encrypt($str,$algo,$key,OPENSSL_RAW_DATA,$iv);
        echo $encrypt;  //显示结果 YzXNRYB6/mmevnBiZPLRPu4Knk+qUVNyhUKonAB2Wjg=
        echo "<br/>";
        $decrypt = openssl_decrypt($encrypt,$algo,$key,OPENSSL_RAW_DATA,$iv);
        echo $decrypt;

从上面可以看到 js 和 php 加密的结果是一样的,那么就说明 前端js 和 后端php也是可以互通加解密的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过防火墙禁止访问指定网站(个人电脑,Windows系统)

背景 近年沉迷B站视频不能自拔&#xff0c;使用了诸多手段禁用&#xff0c;都很容易破戒。为了彻底杜绝B站的使用&#xff0c;决定手动进行设置。在ChatGPT和文心一言提问&#xff0c;得到了以下四种方法&#xff08;按个人认为的戒断水平由低到高排序&#xff09;&#xff1a;…

AI驱动的软件测试,何时可以信赖?

综合编译&#xff5c;TesterHome社区 作者&#xff5c;Yuliya Vasilko&#xff0c;数据工程师 以下为作者观点&#xff1a; 越来越多的组织转向人工智能&#xff08;AI&#xff09;驱动的测试解决方案&#xff0c;以简化质量保证流程并提高软件可靠性。 随着对人工智能的依赖程…

HDRP图形入门:HDRP渲染管线depth翻转

新项目开坑HDRP渲染管线&#xff0c;花了些时间把项目开发框架和图形工作流更新到最新版本&#xff0c;其间发现HDRP中深度信息和buildin渲染管线翻转了。 以前的buildin渲染管线&#xff0c;距离摄像机越近depth->0&#xff0c;越远depth->1&#xff0c;这也很好理…

JAVA毕业设计110—基于Java+Springboot+Vue的房屋租赁系统小程序(源码+数据库)

基于JavaSpringbootVue的房屋租赁系统小程序(源码数据库)110 一、系统介绍 本系统前后端分离 本系统分为用户、房东、超级管理员三种角色 1、用户&#xff1a; 登录、注册、房屋搜索、房屋收藏、看房预约、租房申请、租房记录、看房记录、收藏记录、我的消息、个人信息修改…

js动态显示当前时间

目录 1、封装时间函数 2、在页面写一个div标签&#xff0c;用来存放时间 3、获取div标签&#xff0c;开启定时器&#xff0c;时间为1000ms 4、先调用时间函数&#xff0c;防止页面加载延迟&#xff0c;再在定时器里调用 完整代码 效果图 1、封装时间函数 function getTi…

美团2024届秋招笔试第二场编程真题-小美的数组构造

分析&#xff1a;暴力角度看&#xff0c;因为数组a和b总和一样&#xff0c;所以实际上是将总和m划分为n个数字&#xff0c;且每个数字都和a数组不一样的方案数。当然会超时。从数据角度看&#xff0c;平方级别算法是可以的。 其实用动态规划的四步法分析起来还是很简单的&…

游戏平台采集数据

首先&#xff0c;你需要在你的项目中添加Kotlin的网络库&#xff0c;例如OkHttp。你可以在你的build.gradle文件中添加以下依赖&#xff1a; dependencies {implementation com.squareup.okhttp3:okhttp:4.9.0 }然后&#xff0c;你可以使用以下代码来创建一个基本的网络爬虫&a…

数据库安全:MySQL 身份认证漏洞(CVE-2012-2122)

数据库安全&#xff1a;MySQL 身份认证漏洞&#xff08;CVE-2012-2122&#xff09; MySQL 身份认证漏洞是一个身份认证绕过漏洞&#xff0c;该漏洞的核心原理涉及到 MySQL 在处理身份认证时的一个安全缺陷&#xff0c;这个漏洞可以使攻击者可以绕过安全身份认证&#xff0c;从…

【大模型】大语言模型语料下载

文章目录 概述Hugging Faceobs操作git-lfs例子RedPajama-Data-1TSlimPajama-627B/git clone续传 数据格式参考资料 概述 大模型训练中语料是非常重要的&#xff0c;目前公网上有各种各样的语料可以供下载&#xff0c;但是不可能每个用户、每次训练任务都通过公网去拉取语料&am…

CV计算机视觉每日开源代码Paper with code速览-2023.11.9

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【3D目标检测】3DiffTection: 3D Object Detection with …

代码随想录算法训练营|第五十天

买卖股票的最佳时机含冷冻期 309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; public class Solution {public int MaxProfit(int[] prices) {if(prices.Length 0)return 0;int[,] dp new int[prices.Length1,4];dp[0,0] -prices[0];for(int i1;i&…

NSF服务器

1.简介 1.1 NFS背景介绍 NFS是一种古老的用于在UNIX/Linux主机之间进行文件共享的协议。它古老到你必须穿着白大补才能接近一台计算机的年代。在那个年代&#xff0c;所有的联网计算机都被认为是可信的&#xff0c;而不像现今这样&#xff0c;任何人都有多种多样方法能连接到你…

免费3D骨架工具

免费3D骨架工具 : https://posemy.art/ ControlNet 1.1http://www.coloradmin.cn/o/839105.html?actiononClick https://pan.baidu.com/s/1rh39DI9xVbguLO5l7O4pjA yqqe  网盘里的 预处理器/downloads文件夹&#xff08;包含所有预处理器&#xff09;直接放在 extensions/sd…

功能案例 -- 拖拽上传文件,生成缩略图

直接看效果 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>拖拽上传文件</title>&l…

JLink edu mini 10Pin接口定义

注意&#xff1a;SWD接口在阵脚2&#xff0c;4&#xff1b;而20Pin的SWD接口在阵脚7&#xff0c;9 参考&#xff1a;1 官网资料&#xff1b; 2 【润石RS0104YQ Demo开发板测试分享】J-Link EDU Mini调试5V系统_国产运算放大器_模拟开关_线性稳压器_电平转换器_小逻辑_比较器…

图解算法数据结构-LeetBook-数组03_除本身之外乘积

为了深入了解这些生物群体的生态特征&#xff0c;你们进行了大量的实地观察和数据采集。数组 arrayA 记录了各个生物群体数量数据&#xff0c;其中 arrayA[i] 表示第 i 个生物群体的数量。请返回一个数组 arrayB&#xff0c;该数组为基于数组 arrayA 中的数据计算得出的结果&am…

联系作者方式的教程

首先你应该目前是在付费资源运行效果的展示文章页面&#xff0c;如下所示 然后一直往下滑&#xff0c;滑到这个文章的最下面&#xff0c;就可以看到我的推广名片&#xff0c;最后点击这个名片就可以获取到我的联系方式了~

python速成

list类型中所有的方法(除sort之外)&#xff0c; 每一个方法附带一个实例&#xff1a;以及解释说明 append append(self, object, /) Append object to the end of the list. clear clear(self, /) Remove all items from list. 从列表中删除所有项目。 list_data [1,…

Java中的 向上转型 | 向下转型

目录 一.向上转型 直接赋值 总结&#xff1a; 通过传参 通过返回值 二.向下转型 instanceof 一.向上转型 向上转型其实就是创建一个子类对象&#xff0c;并将其当作父类对象来使用&#xff0c;一般语法格式如下&#xff1a; 父类类型 对象名 new 子类类型() 一般有以…

【Linux】八、进程通信

进程通信的介绍 目的 数据传输&#xff1a;一个进程将它的数据发送给另一个进程&#xff1b; 资源共享&#xff1a;多个进程间共享资源&#xff1b; 通知事件&#xff1a;一个进程向另一个或一组进程发送消息&#xff0c;同时事件如&#xff0c;进程终止时要通知父进程&#xf…