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

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);    //把二进制数据转成base64console.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);     // 显示 stringecho "<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);  //把二进制转成utf8console.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.mzph.cn/news/142241.shtml

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

相关文章

RT-Thread系列10——ETH网口设备

文章目录 1. ETH测试第一步&#xff1a;cubemx配置。第二步&#xff1a;board.h配置。第三步&#xff1a;rtthread settings配置第四步&#xff1a;以太网复位引脚设置第五步&#xff1a;修改rtthread源码第六步&#xff1a;修改 cubemx 生成的 main 函数第七步&#xff1a;编译…

C++阶段复习‘‘‘‘总结?【4w字。。。】

文章目录 前言类和对象C类定义和对象定义类成员函数C 类访问修饰符公有&#xff08;public&#xff09;成员私有&#xff08;private&#xff09;成员受保护&#xff08;protected&#xff09;成员 继承中的特点类的构造函数和析构函数 友元函数内联函数this指针指向类的指针类…

缩点+图论路径网络流:1114T4

http://cplusoj.com/d/senior/p/SS231114D 重新梳理一下题目 我们先建图 x → y x\to y x→y&#xff0c;然后对点分类&#xff1a;原串出现点&#xff0c;原串未出现点。 假如我们对一个原串出现点进行了操作&#xff0c;那么它剩余所有出边我们立刻去操作必然没有影响。所…

快速入门安装及使用git与svn的区别常用命令

一、导言 1、什么是svn&#xff1f; SVN是Subversion的简称&#xff0c;是一个集中式版本控制系统。与Git不同&#xff0c;SVN没有分布式的特性。在SVN中&#xff0c;项目的代码仓库位于服务器上&#xff0c;团队成员通过向服务器提交和获取代码来实现版本控制。SVN记录了每个…

数据库实验二

--①查询信息管理系学生的学号和姓名。 --select sno,sname from Student where sdept IS --②查询选修了课程的学生的学号。 --select distinct sc.sno from sc,student --③查询选修了课程号为C001的学生的学号和成绩&#xff0c;并对查询结果按成绩降序排列&#xff0c;如…

专题知识点-二叉树-(非常有意义的一篇文章)

这里写目录标题 二叉树的基础知识知识点一(二叉树性质 )树与二叉树的相互转换二叉树的遍历层次优先遍历树的深度和广度优先遍历中序线索二叉树二叉树相关遍历代码顺序存储和链式存储二叉树的遍历二叉树的相关例题左右两边表达式求值求树的深度找数找第k个数二叉树非递归遍历代码…

蒙特卡洛树搜索(Monte Carlo Tree Search)揭秘

一. 什么是蒙特卡洛树搜索 蒙特卡洛树搜索(MCTS)是一种启发式搜索算法&#xff0c;一般用在棋牌游戏中&#xff0c;如围棋、西洋棋、象棋、黑白棋、德州扑克等。MCTS与人工神经网络结合&#xff0c;可发挥巨大的作用&#xff0c;典型的例子是2016年的AlphaGo&#xff0c;以4:1…

Elasticsearch:ES|QL 快速入门

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题&#xff0c;但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。目前的最新发行版为 Elastic Stack 8.11。 Elasticsearch 查询语言 (ES|QL) 提供了一种强…

gin架构下实现页面的数据调用

package mainimport ("github.com/gin-gonic/gin"_ "net/http""testgin01/myfunc" )func main() {r : gin.Default()//r.LoadHTMLFiles("/temp/hello01.html")r.LoadHTMLGlob("temp/**/*") // **/代表一个文件级//指定cSS文…

快速构建高质量中文APP登录注册页面Figma源文件

在这个数字化时代&#xff0c;移动应用程序&#xff08;APP&#xff09;已经成为我们日常生活中不可或缺的一部分。如果您正在为您的中文APP开发登录注册页面&#xff0c;并寻找高质量的UI设计素材&#xff0c;那么您来对地方了&#xff01;我们为您提供了一个完整的Figma源文件…

工作效率提升工具,帮助企业突破发展瓶颈!

企业发展“瓶颈”意味着企业处于这个阶段时&#xff0c;上不去下不来&#xff0c;出现停滞或者是反复波动的现象&#xff0c;而且持续时间较长&#xff0c;虽然企业苦苦探索变革之道&#xff0c;但是往往事倍功半&#xff0c;反而导致变革成本不断上升。 工作效率提升工具&…

Seatunnel单机和集群部署说明

编译 编译命令 mvn clean package -pl seatunnel-dist -am -Dmaven.test.skiptrue 部署 将seatunnel-dist\target目录下的apache-seatunnel-2.3.3-SNAPSHOT-bin.tar.gz上传至服务器 解压安装包到/opt/soft/seatunnel目录下 配置环境变量 export SEATUNNEL_HOME/opt/soft/s…

nginx之使用与配置教程

目录 简介 优点 安装 目录结构 nginx.conf配置文件结构 server虚拟主机配置 listen server_name location root index try_files proxy_pass 使用 反向代理 配置语法 常用指令 proxy_pass proxy_set_header proxy_redirect 负载均衡 负载均衡策略 轮询&…

竞赛选题 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

【学习笔记】[EGOI2023] Bikes vs Cars

题目链接 警惕出题人为了不让你看出来构造是生成树而用了 2023 2023 2023这个数字&#x1f605; 下文中宽度为 w w w的边表示分配给自行车的宽度。 考虑如何判定无解。如果存在 i , j , k i,j,k i,j,k使得 b i , j < min ⁡ ( b i , k , b k , j ) b_{i,j}<\min(b_{i,…

可以非常明显地感受到,一场有关直播带货的暗流正在涌动

虽然有关直播带货的争论依然还在持续&#xff0c;但是&#xff0c;我们依然无法否认今年的双十一依然是直播带货的高光时刻。无论是以淘宝、京东和拼多多为代表的传统电商平台&#xff0c;还是以抖音、快手为代表的新电商平台&#xff0c;几乎都将今年双十一的重心放在了直播带…

Java入门篇 之 继承

本篇碎碎念&#xff1a;最近的课程遇到瓶颈了&#xff0c;看的时候感觉自己会了&#xff0c;但是结束仔细一回顾还是一知半解&#xff0c;一点一点来吧&#xff0c;基础必须要打好(自己给自己好的心里暗示&#xff0c;结局一定是好的) 今日份励志文案:慢慢改变&#xff0c;慢慢…

SELF-AUGMENTED MULTI-MODAL FEATURE EMBEDDING

two embeddings f o r g _{org} org​ and f a u g _{aug} aug​ are combined using a gating mechanism 作者未提供代码

实战Leetcode(五)

Practice makes perfect&#xff01; 实战一&#xff1a; 思路&#xff1a;我们要用复制的节点来组成一个新的链表&#xff0c;而原链表的节点随机指向其中一个节点&#xff0c;我们首先给每一个节点都复制并且插入到原来节点的后面&#xff0c;然后用复制的节点指向我们原来节…