一、AES加密算法
原理请自行百度,对于非魔改的AES,我们只需要得到密钥即可进行加解密,因为这是对称加密。本文讨论范围仅限于前端范畴(笔者认知有限)。
二、JS逆向
众所周知,浏览器里面没有秘密;私以为,debugger的上限即是能力的上限,下面笔者就拿自己做过的几个网站举例(重要信息已打马赛克)。
1、在下面这个登录页中,我们输入完账号和密码 , 下图一
2、发现密码被加密传输了,于是我们想知道是什么加密手段以及如何解密!
3、于是就找登录接口或加密所在位置,这里请求方式是Url类请求。 Url类和Body类请求
4、自然我们发现 ? 后面的参数是关键,然后搜索 appCode。
5、找到几个JS文件,我们依次打开,然后搜索 encrypt(encrypt加密,decrypt解密,一般来说大部分网站都是采用AES加密)。 下图二
6、我们看到 a.password 在这边进行了加密处理,打个断点看一下。 下图三
7、在搜索这个 key ,我们成功找到了密钥 ! 下图四
8、接下来我们确定这个AES是标准的AES加密,点源码进去看一下。 下图一
9、然后把这几行代码复制到我们的项目中,注意安装依赖替换。 下图二
10、然后打印一下 a 看一下,成功打印加密后的值。 下图三
11、通过百度得知解密是 AES.decrypt,我们写一个通用方法。 下图四、下图五
好的,到现在为止,我们完成了AES加解密的操作,最下面有番外喔!!!
举一反三,我们再拿一个网站开刀
是不是很 Easy~~!!
三、总结
对普通网站而言,信息安全没有那么重要;但是对于个别网站,虽然对数据进行了加密,但也是只能防防君子。那么我们获取数据必然要发送请求,开发者可以通过封IP等其他手段进行打击。此外,比较安全的加密方式是非对称加密,这里献上大佬的文章->前后端 JS 加密常用方法(非对称加密、对称加密)
四、番外
上文说道,我们成功在家庭服务器上面部署了npm私服(verdaccio)。
于是,我们想把这个AES加解密通用方法做成npm包发布上去。
1、 初始化项目
npm init
2、 安装依赖,导出函数(代码再最下方)
3、 编写 README.md 文件(网上有很多漂亮的模板可以参考)
4、添加、切换源
4、推送包(登录?)
5、在项目中使用
npm install yaes
6、代码块
import pkg from 'crypto-js';
const { enc, AES, mode: _mode, pad } = pkg;
const aes = (type, pwd, key) => {
//pwd明文|密码 key秘钥
const keys = enc.Utf8.parse(key);
const pwds = enc.Utf8.parse(pwd);
if (type === "加密") {
const encryptedData = AES.encrypt(pwds, keys, {
mode: _mode.ECB,
padding: pad.Pkcs7,
}).ciphertext.toString();
return encryptedData;
} else {
const encryptedHexStr = enc.Hex.parse(pwd);
const encryptedBase64Str = enc.Base64.stringify(encryptedHexStr);
const decryptedData = AES.decrypt(encryptedBase64Str, keys, {
mode: _mode.ECB,
padding: pad.Pkcs7,
}).toString(enc.Utf8);
return decryptedData;
}
}
export default aes;