一、安装环境
本教程演示的环境
系统:win 11 64位
node.js下载地址: http://nodejs.cn/
node.js版本:长期支持版本(本教程基于16.15.0)
二、安装步骤
1、双击安装包,一直点击下一步。
2、点击change按钮,更换到自己的指定安装位置,点击下一步(不修改默认位置也是可以的 )。
3、一直点击下一步,最后安装成功即可。
三、验证安装
1、在键盘按下【win+R】键,输入cmd,然后回车,打开命令行界面
2、进入命令提示符窗口,分别输入以下命令,显示版本号,则安装成功
node -v 显示安装的nodejs版本
npm -v 显示安装的npm版本
四、修改全局模块下载路径
1、我希望将全模块所在路径和缓存路径放在我node.js安装的文件夹中,则在我安装的文件夹【D:\DevTools\Environment\nodejs】下创建两个文件夹【node_global】及【node_cache】如下图:
创建完两个空文件夹之后,跟之前操作一样,在键盘按下【win+R】键,输入cmd,然后回车,打开命令行界面,输入下面命令。
prefix = 创建的node_global文件夹所在路径
cache = 创建的node_cache文件夹所在路径
-------------------------------------------------------------------------------
npm config set prefix "D:\DevTools\Environment\nodejs\node_global"
npm config set cache "D:\DevTools\Environment\nodejs\node_cache"
2、修改系统环境变量
右键我的电脑,选择属性
在打开的窗口中选择高级系统设置
选择环境变量
选择系统变量的Path变量,新增node_global文件夹的路径
经过上面的步骤,nodejs下载的模块就会自动下载到我们自定义的目录,接下来我们测试一下。输入下面的命令:
npm install express -g # -g是全局安装的意思,不加 -g 就是默认下载到当前目录
如图,下载成功,我们回到我们定义的目录查看。
可以看到,下载的express模块以及成功下载到全局的指定目录。
注:若执行命令npm install express -g 出现如下报错
是由于权限的原因,右击Nodejs文件夹->属性->安全,点击编辑,将所有权限都✔即可。
五、更换npm源为淘宝镜像
说明:npm 默认的 registry ,也就是下载 npm 包时是从国外的服务器下载,国内很慢,一般都会指向淘宝 https://registry.npm.taobao.org。 1、查看初始npm源,如图:
npm config get registry
2、更换镜像为淘宝镜像
npm config set registry https://registry.npm.taobao.org/
3、检查配置是否成功
npm config get registry
六、全局安装基于淘宝源的cnpm(或安装yarn也可以)
说明:由于npm的服务器在海外,所以访问速度比较慢,访问不稳定 ,cnpm的服务器是由淘宝团队提供 服务器在国内cnpm是npm镜像,一般会同步更新,相差在10分钟,所以cnpm在安装一些软件时候会比较有优势。但是一般cnpm只用于安装时候,所以在项目创建与卸载等相关操作时候我们还是使用npm。 1、全局安装基于淘宝源的cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
2、下载完后,我们在本地就能看到cnpm模块
3、执行命令查看cnpm是否安装成功
cnpm -v
七、安装crypto-js库
crypto-js
是一个纯 javascript
写的加密算法类库 ,可以非常方便地在 javascript
进行 MD5
、SHA1
、SHA2
、SHA3
、RIPEMD-160
哈希散列,进行 AES
、DES
、Rabbit
、RC4
、Triple DES
加解密。
npm install -g crypto-js
八、使用
ES6模块引入方法:
import sha256 from 'crypto-js/sha256';
import hmacSHA512 from 'crypto-js/hmac-sha512';
import Base64 from 'crypto-js/enc-base64';
模块加载引入方法:
import sha256 from 'crypto-js/sha256';
import hmacSHA512 from 'crypto-js/hmac-sha512';
import Base64 from 'crypto-js/enc-base64';
页面标签引入方法:
<script type="text/javascript" src="path-to/bower_components/crypto-js/crypto-js.js"></script>
<script type="text/javascript">
var encrypted = CryptoJS.AES(...);
var encrypted = CryptoJS.SHA256(...);
</script>
九、项目中使用实例
这里我以 React
作为例子,其他的也就大同小异了。
-
第一步:封装工具类
我们可以写一个工具类,专门封装加密解密的方法,比如我新建一个 cryptoAES.js
的文件,放在 utils
目录下(放哪无所谓),代码如下:
const CryptoJS = require('crypto-js'); //引用AES源码js
const key = CryptoJS.enc.Utf8.parse("1234123412ABCDEF"); //十六位十六进制数作为密钥
const iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412'); //十六位十六进制数作为密钥偏移量
//解密方法
function (word) {
let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
//加密方法
function Encrypt(word) {
let srcs = CryptoJS.enc.Utf8.parse(word);
let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
return encrypted.ciphertext.toString().toUpperCase();
}
export default {
Decrypt ,
Encrypt
}
上面的代码中的 key
是密钥 ,iv
是密钥偏移量,这两个参数前后端协定好保持一致,相当是我们的小秘密,不能告诉别人,不然加密的意义就没了。
值得注意的是密钥的长度,由于对称解密使用的算法是 AES-128-CBC
算法,数据采用 PKCS#7
填充 , 因此这里的 key
需要为16位!
接着我们定义了解密方法 Decrypt
和加密方法 Encrypt
,最后通过 export
和 default
将其暴露出去,方便在需要的时候进行引入....
工具类写好了,很简单,然后是怎么使用了~
-
第二步:使用工具类
我们有一个 index.tsx
文件,在这里面使用加密和解密的方法。
这里我只演示加密,解密同理。
import { Decrypt, Encrypt } from '/utils /cryptoAES.js';
//比如我组装好了拼接的参数
const str = '103170,112425366,253.00,20210428173700'
Encrypt(str)
加密后的结果是:
hoDfJ9U+uY+v8wYKdudbTUR+Z7g1Ui9YraVhfD9g2fMipYlFxnoLE0qbf+YsnEuk
这里有个问题,加密后的字符串里面是包含了+号,发送的话,在进行地址解析时,会把 + 号转换为 空格, 直接导致参数不能正确传输,所以我们用到了 JS
的 encodeURIComponent()
,将所有的 + 号 手动转换为 %2B
即可正常传输。
encodeURIComponent(str)
//返回新结果
hoDfJ9U%2BuY%2Bv8wYKdudbTUR%2BZ7g1Ui9YraVhfD9g2fMipYlFxnoLE0qbf%2BYsnEuk
好了,一个简单的前端加密的过程就写完了。
十、实战某网址获取加密算法
登录账户:user密码:123456 加密后的密码数据:A7428361DEF118911783F446A129FFCE
1、由此可见密码是在前端进行加密的,而且我们发现这是个xhr的请求
我们找到了加密模块,并跟踪进去
可以看出这便是他的加密模块,采用的加密方式是AEX,同时调用了crypto-js库。
我们发现是encrypt的返回值正式我们的加密密码,
这便是他的加密代码,继续深入把他加解密算法找出来
import CryptoJS from 'crypto-js'
const key = CryptoJS
.enc
.Utf8
.parse("20171109124536982017110912453698");
const iv = CryptoJS
.enc
.Utf8
.parse('2017110912453698'); //十六位十六进制数作为密钥偏移量
const encrypt = (word: string) => {
let srcs = CryptoJS
.enc
.Utf8
.parse(word);
let encrypted = CryptoJS
.AES
.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted
.ciphertext
.toString()
.toUpperCase();
}
export const passwordEncrypt = (password: string) => {
if (typeof password === 'undefined') return undefined
if (!password) return ''
return encrypt(password)
}
经过我们的不懈努力,终于找到了加解密的js文件
代码展示
import CryptoJS from 'crypto-js'
const key = CryptoJS
.enc
.Utf8
.parse("20171109124536982017110912453698");
const iv = CryptoJS
.enc
.Utf8
.parse('2017110912453698'); //十六位十六进制数作为密钥偏移量
/**
* @return {string}
*/
function Decrypt(word) {
let encryptedHexStr = CryptoJS
.enc
.Hex
.parse(word);
let srcs = CryptoJS
.enc
.Base64
.stringify(encryptedHexStr);
let decrypt = CryptoJS
.AES
.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
/**
* @return {string}
*/
function Encrypt(word) {
let srcs = CryptoJS
.enc
.Utf8
.parse(word);
let encrypted = CryptoJS
.AES
.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted
.ciphertext
.toString()
.toUpperCase();
}
export {Decrypt, Encrypt}
A7428361DEF118911783F446A129FFCE 123456 至此结束
总结
-
使用加密的场景有很多,我这里只讲述了URL地址加密的场景,简单总结下:
-
第一步:安装
crypto-js
-
第二步:引入
crypto-js
-
第三步:封装工具类(当然也可以直接使用)
-
第四步:调用工具类
-
第五步:使用
encodeURIComponent
方法转码,然后拼接
当然,这个是最基础的用法,想深入可查看官方文档!
除了实战是自己写的外,其余都是选取以下链接:
至于为何选取,原因充当笔记