js加密怎么破解(爬虫破解js加密的流程)
场景
在开发过程中,我们会经常会从当前系统跳转别的系统进行访问或者页面嵌套使用。
那一般都会给到一个地址进行参数拼接,然后去访问。那么会存在一个问题,就是地址暴露在外面参数使用明文的话会被篡改,极度不安全。
这个时候我们就考虑到加密,前端和后端协定好一种加密方式,然后前端进行参数加密传到后端,后端再去解密(可逆)。
加密方式也有很多种,今天我推荐的是一款强大的前端加密/解密js库——crypto-js。
crypto-js是什么
crypto-js 是一个纯 javascript 写的加密算法类库 ,可以非常方便地在 javascript 进行 md5、sha1、sha2、sha3、ripemd-160 哈希散列,进行 aes、des、rabbit、rc4、triple des 加解密。
github:https://github.com/brix/crypto-js
安装
npm install crypto-js
使用
es6模块引入方法:
import sha256 from 'crypto-js/sha256';
import hmacsha512 from 'crypto-js/hmac-sha512';
import base64 from 'crypto-js/enc-base64';
模块加载引入方法:
var aes = require("crypto-js/aes");
var sha256 = require("crypto-js/sha256");
页面标签引入方法:
<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
好了,一个简单的前端加密的过程就写完了。
总结
使用加密的场景有很多,我这里只讲述了url地址加密的场景,简单总结下:
第一步:安装crypto-js
第二步:引入crypto-js
第三步:封装工具类(当然也可以直接使用)
第四步:调用工具类
第五步:使用encodeuricomponent方法转码,然后拼接
当然,这个是最基础的用法,想深入可查看官方文档!
结尾:希望小凡的每篇文章对你都有所帮助!