js常见的加密方式
- 常见的加密算法基本分为这几类:
- 线性散列算法(签名算法) MD5 md2 md4 sha1 sha256 sha512 (取盐)
- 对称性加密算法 AES DES
- 非对称性加密算法 RSA
Md5加密
- MD5 是一种广泛使用的线性散列算法, 可以产生出一个128位的散列值(hash value),MD5加密之后产生的 一般是固定长度 (32位或者16位)的数据
- 解密:
- 常规讲 MD5不存在解密的, 但是可以反向暴力破解
在测试的时候 一般默认密码输入123456 抓包看到加密的如果是e10adc3949ba59abbe56e057f20f883e(32位的)则是md5加密
- 常规讲 MD5不存在解密的, 但是可以反向暴力破解
示例代码:
<!DOCTYPE html>
<html lang="en">
<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script>
<script type="text/javascript">
var hashCode = md5('i am bobo!');
alert(hashCode)
</script>
</html>
注意后续js中出现 md5字样 基本上就是 采用md5加密方式 如果加密的是 16进制 且32位长度 那大概率也是md5加密
DES/AES 加密
- DES 即数据加密标准, 是一种使用密钥加密的算法。 该算法是一种对称加密方式, 其加密运算、解密运算需要使用同样的密钥( 一组字符串)
- 注意:
- 现在用AES这个标准来替代原先的DES。
- AES和DES的区别:
- 加密后密文长度的不同:
- DES 加密后密文长度是8的整数倍
- AES 加密后密文长度是16发整数倍
- 应用场景不同:
- 企业级开发使用DES足够安全
- 如果要求高 则使用AES
- DES 和AES 切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
- 加密后密文长度的不同:
- 使用DES/AES进行数据交互时要求双方都拥有相同的私钥
- 破解方法:
- 暴力破解。
- DES算法的入口参数有三个:
- Key、Data、Mode、padding.
- Key 位7个字节共56位, 是DES算法的工作密钥
- Data位8个字节64位, 是要被加密或被解密的数据
- Mode位DES的工作方式
- padding位填充模式, 如果加密后密文长度如果达不到指定整数倍(8个字节、16个字节)填充对应字节
示例代码
<!DOCTYPE html>
<html lang="en">
<script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
<script type="text/javascript">
var aseKey = '12345678'; // 定制密钥, 长度必须为:8/16/32位
var message = "i am bobo,who are you ?";
// 加密 DES/AES 切换只需要修改 CryptoJS.DES -》 CryptoJS.AES
var encrypt = CryptoJS.DES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey), {
mode: CryptoJS.mode.ECB, // 这两行固定写法
padding: CryptoJS.pad.Pkcs7
}).toString();
alert(encrypt);
// 解密
var decrypt = CryptoJS.DES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey),{
mode: CryptoJS.mode.ECB, // 这两行固定写法
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
alert(decrypt); // 解密完的密码
</script>
</html>
出现 DES 或者 AES基本上就是该加密方式
RSA加密
公钥加密 私钥解密
在公开密钥加密和电子商业中RSA被广泛使用
``私钥不可随心设置 是根据公钥计算生成的
示例代码
<!DOCTYPE html>
<html lang="en">
<script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>
<script type="text/javascript">
// 公钥
var PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----' +
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2MHiVKHV2bOwFpg0mZb6B3e/a' +
'59nezjIEZmbe24fxVZwQ3p0q2DWtqI0eGQtf0wJ4DD+12nPbZVWOCxUKCk9M+t/T' +
'9d0j9MaTUgkBvM0JVNtYzqgstIcok0tlWblvt/1gQes0jXkJLHu9fwR6t7R0eqAC' +
'Z4A495mhf6/QbZurZQIDAQAB' +
'-----END PUBLIC KEY-----';
// 私钥
var PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----" +
"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALYweJUodXZs7AWm" +
"DSZlvoHd79rn2d7OMgRmZt7bh/FVnBDenSrYNa2ojR4ZC1/TAngMP7Xac9tlVY4L" +
"FQoKT0z639P13SP0xpNSCQG8zQlU21jOqCy0hyiTS2VZuW+3/WBB6zSNeQkse71/" +
"BHq3tHR6oAJngDj3maF/r9Btm6tlAgMBAAECgYAOpcT8EP2ooMc1CQ2jmaiAXmyL" +
"R/qvPBqvWeBJaJL8Zyqd/JfcOvfN13BJDDBq6tcW+b0hjMelyvbe7asqXHvVjJ3d" +
"f/ay7LxLLdzx/SxdaD6Llfwzm7g7Uljw/fqF4cd+AY1As4gRHrGO9xA+QR/vg1U7" +
"6b/vlsD8yfIcQSwYXQJBAPIdK5m+1CxPIdXYWTsXvOOB6ACpIosFcfa3uQ14OQ5I" +
"0NrUXlskVe6Y5sGE5fcwgzHy2iaDu5gT/sK53oiuPTcCQQDAo3WxYJamJ3mK9EXf" +
"BlxNAmH1zG7Jp3ZzKzJNWOG4Q1EEG1fJQB3Z6V2unvPEu7A2zxthG+iRrvTBMU6u" +
"DopDAkB+gCNBx2UQaaAiHVIx/+sfa8aOYdC8lnG/GKtFkGUvQ3hsfb13HXsQmS8o" +
"OYn2J5DEzkCREw83HGtlzruo6nDtAkEAkRsPzlrpX6MghLDX6NVLtZ5z18j0MuX3" +
"7Wy+aVDoRfo/Do7iI3AujDSjIqQND0YpyD9dalqxZvuY1eWkVKwTLQJBAK6iIbD+" +
"hk6IVIZmqwwqxYL0/q3XHnczewxG5NHg66gGl86GZJITbLXEnju+xnFXHrGdplZB" +
"eZJpkUz1wAcaoGc=" +
"-----END PRIVATE KEY-----";
// 加密 DES/AES 切换只需要修改 CryptoJS.DES -》 CryptoJS.AES
var encrypt = new JSEncrypt(); // 实例化加密对象
encrypt.setPublicKey(PUBLIC_KEY); // 设置公钥
var encrypted = encrypt.encrypt('hello bobo!'); // 对指定数据进行加密
alert(encrypted);
// 使用私钥解密
var decrypt = new JSEncrypt();
decrypt.setPrivateKey(PRIVATE_KEY); // 设置私钥
var uncrypted = decrypt.decrypt(encrypted); // 解密
alert(uncrypted); // 解密完
</script>
</html>
证书中包含了 公钥和企业相关信息
微信公众号平台js算法改写
- 先输入错误的邮箱和密码 然后 打开抓包工具 点击登录 看看抓包工具
- 然后通过 查看该请求调用了那些js文件 判断出最右可能的
- 在可疑的js文件中 直接ctrl + F 进行搜索 pwd 对可疑的地方都进行断点调试
- 当程序真的走到这里的时候 可以进行全选 函数 看函数返回的是什么
- 进入到里面后可以将 那附近相关代码都拷贝到 发条js调试工具中进行改编
- 要想在pycharm中使用 js代码
- node.js环境的安装
- pip install PyExecJs
import execjs
# 1.实例化一个node对象
node = execjs.get()
# 2.js源文件编译
ctx = node.compile(open('./Wechat.js', encoding='utf-8').read())
# 3.执行js函数
funcName = 'getPwd("{0}")'.format('123456')
pwd = ctx.eval(funcName)
print(pwd) # e10adc3949ba59abbe56e057f20f883e