js逆向之加密算法介绍

目录 

前言

一、js常见的加密方式

Md5加密

对称加密DES/AES

非对称加密RSA

base64伪加密


前言

何为逆向:与逆向相对的是正向,正向即采用某种加密方式对数据进行加密,或对加密代码进行混淆,以增加反爬策略的复杂度。那么逆向就很好理解了:对加密的方式进行破解、还原。

现在越来越多的网站在web前端使用js对数据进行加密处理,当我们想对网站的某个登录框进行爆破的时候,发现密码字段进行了加密,这就头疼了使得我们爆破不了。接下来就对如何进行js逆向,找出其加密算法做一个分析。

一、js常见的加密方式

要想会逆向,必须知道正向原理,即js是如何对数据进行加密的,常见的加密算法又有哪些。常见的加密算法基本可以分为这几类:

  • 线性散列算法(签名算法)MD5
  • 对称性加密算法AES DES
  • 非对称性加密算法 RSA

Md5加密

MD5是一种被广泛使用的线性散列算法,可以产生出一个128位〈16字节)的散列值(hashvalue),用于确保信息传输完整的一致性。且MD5加密之后产生的是一个由大写字母、小写字母以及数字组成的固定长度(32位或16位)的数据。

md5解密:
常规讲MD5是不存在解密的。但是理论上MD5是可以进行反向暴力破解的。暴力破解的大致原理就是用很多不同的数据进行加密后跟已有的加密数据进行对比,由此来寻找规律。理论上只要数据量足够庞大MD5是可以被破解的。但是要注意,破解MD5是需要考虑破解的成本(时间和机器性能)。假设破解当前的MD5密码需要目前计算能力最优秀的计算机工作100年才能破解完成。那么当前的MD5密码就是安全的。

增加破解成本的方法(方法很多,这里只说常用的)。

  • 使用一段无意义且随机的私匙进行MD5加密会生成一个加密串,我们暂且称之为串1
  • 将要加密的的数据跟串1拼接,再进行一次MD5,这时会生成串2
  • 将串2再次进行MD5加密,这时生成的串3就是我们加密后的数据。我们在注册账号时的密码一般都是用的MD5加密。 

md5加密案例

具体的加密流程在src值中,我们不需要理解其具体的加密原理,只需要会调用其中的加密函数进行加密就行。

<html>
	<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script>
	<script type="text/javascript">
		var hashCode = md5("i am xxx ! ");
		alert(hashCode)
	</script>
</html>

 所在在碰到这种只有字母和数字,长为32或64长度的就要想到md5加密

对称加密DES/AES

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的算法。该加密算法是一种对称加密方式,其加密运算、解密运算需要使用的是同样的密钥(一组字符串)即可。

现在用AES这个标准来替代原先的DES。

DES和AES的区别

1. 加密后密文长度的不同:

  • DES加密后密文长度是8的整数倍
  • AES加密后密文长度是16的整数倍。

2. 应用场景的不同:

  • 企业级开发使用DES足够安全
  • 如果要求高使用AES

DES和AES切换只需要修改CryptoJS.AES <=> CryptoJS.DES

使用DES/AES进行数据交互时要求双方都拥有相同的私匙

破解方法:

  • 暴力破解。
  • DES如果使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。只要计算足够强大是可以被破解的

DES算法的入口参数有三个

  • Key、Data、Mode,padding。
    • Key为7个字节共56位,是DES算法的工作密钥;
    • Data为8个字节64位,是要被加密或被解密的数据;
    • Mode为DES的工作方式。
    • padding为填充模式,如果加密后密文长度如果达不到指定整数倍(8个字节、16个字节),填充对应字符
      • padding的赋值固定为CryptoJS.pad.Pkcs7即可

DES加密案例

<html>
    <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script type="text/javascript">
        //定制秘钥,长度必须为:8/16/32位。在实际网站中不会写的这么简单,一般是通过发起新的请求获取
        var aseKey = "12345678"     
        var message = "i am here,where are?";

        //加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
        var encrypt = CryptoJS.DES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
        }).toString();

        alert(encrypt); // 8J/ap1n9rWPSQLlUimZJ7NKTQv+b4u+4

        //解密
        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); // i am here,where are?
    </script>
        
</html>

AES加密案例

<html>
	<script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script type="text/javascript">
    	//定制秘钥,长度必须为:8/16/32位。在实际网站中不会写的这么简单,一般是通过发起新的请求获取
		var aseKey = "12345678"     
		var message = "i am here,where are?";

		//加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
		var encrypt = CryptoJS.AES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey), {
		mode: CryptoJS.mode.ECB,
		padding: CryptoJS.pad.Pkcs7
		}).toString();

		alert(encrypt); 
		//解密
		var decrypt = CryptoJS.AES.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对同一组数据加密后,AES加密后的数据更长。且加密后的密文长度和明文的长度有关

非对称加密RSA

  • RSA加密:
    • RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。
  • 非对称加密算法:
    • 非对称加密算法需要两个密钥:
      • 公开密钥(publickey:简称公钥)
      • 私有密钥(privatekey:简称私钥)
      • 公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
  • 注意:
    • 使用时都是使用公匙加密使用私匙解密。公匙可以公开,私匙自己保留。
    • 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。
  • 使用流程和场景介绍
    • 通过公匙加密,使用私匙解密。私匙是通过公匙计算生成的。假设ABC三方之间相互要进行加密通信。大家相互之间使用公匙进行信息加密,信息读取时使用各自对应的私匙进行信息解密
    • 用户输入的支付密码会通过RSA加密
  • 公钥私钥生成方式:

    <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-----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALyBJ6kZ/VFJYTV3vOC07jqWIqgyvHulv6us/8wzlSBqQ2+eOTX7s5zKfXY40yZWDoCaIGk+tP/sc0D6dQzjaxECAwEAAQ==-----END PUBLIC KEY-----';
        //私钥
        var PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvIEnqRn9UUlhNXe84LTuOpYiqDK8e6W/q6z/zDOVIGpDb545NfuznMp9djjTJlYOgJogaT60/+xzQPp1DONrEQIDAQABAkEAu7DFsqQEDDnKJpiwYfUE9ySiIWNTNLJWZDN/Bu2dYIV4DO2A5aHZfMe48rga5BkoWq2LALlY3tqsOFTe3M6yoQIhAOSfSAU3H6jIOnlEiZabUrVGqiFLCb5Ut3Jz9NN+5p59AiEA0xQDMrxWBBJ9BYq6RRY4pXwa/MthX/8Hy+3GnvNw/yUCIG/3Ee578KVYakq5pih8KSVeVjO37C2qj60d3Ok3XPqBAiEAqGPvxTsAuBDz0kcBIPqASGzArumljkrLsoHHkakOfU0CIDuhxKQwHlXFDO79ppYAPcVO3bph672qGD84YUaHF+pQ-----END PRIVATE KEY-----';
        //使用公钥加密
        var encrypt = new JSEncrypt();//实例化加密对象
        encrypt.setPublicKey(PUBLIC_KEY);//设置公钥
        var encrypted = encrypt.encrypt('hello World!');//对指定数据进行加密
        alert(encrypted)
        //使用私钥解密
        var decrypt = new JSEncrypt();
        decrypt.setPrivateKey(PRIVATE_KEY);//设置私钥
        var uncrypted = decrypt.decrypt(encrypted);//解密
        alert(uncrypted);
    </script>
</html>

 如果在js代码中发现了setPublicKey这关键字,那肯定是使用的RSA加密

base64伪加密

Base64是一种用64个字符(A--Z,a--z,0--9,+,/,=(用于补缺))来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法。只是看上去像是加密而已。

<html>
    <script type="text/javascript">
        // 创建Base64对象
        var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}
         
        // 定义字符串
        var string = 'Hello World';
         
        // 加密
        var encodedString = Base64.encode(string);
        alert(encodedString); 
         
        // 解密
        var decodedString = Base64.decode(encodedString);
        alert(decodedString); 
    </script>
        
</html>

 以上就是常见的js加密方式,了解了js的加密方式后就可以尝试逆向分析了

感谢bobo老师分享的 ——》 爬虫逆向解析

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
根据提供的引用内容,我无法直接回答您的问题。引用提到了DES加密算法,它是一种对称加密算法,需要使用相同的密钥进行加密和解密。引用提到了拼多多的API解密和JS逆向安全控制实现。然而,您的问题是关于加密算法JS逆向安全控制实现的,而不是关于DES加密算法或拼多多API解密的。 对于加密算法JS逆向安全控制实现的问题,我可以提供一些一般性的信息和建议: 1. JS逆向工程:JS逆向工程是指通过分析和破解JavaScript代码来获取其内部逻辑和实现细节。这可以帮助您理解加密算法的实现方式和安全控制措施。 2. 安全控制实现:在加密算法中,安全控制是指保护密钥和加密数据的措施。这包括密钥管理、访问控制、防止信息泄露等方面的措施。在实现加密算法时,需要考虑这些安全控制措施以确保数据的安全性。 3. 加密算法选择:选择适合您需求的加密算法是非常重要的。不同的加密算法具有不同的安全性和性能特点。您可以根据您的具体需求选择合适的加密算法。 4. 密钥管理:密钥管理是加密算法中的一个重要方面。确保密钥的安全性和合理的密钥分发、存储和更新策略是保护加密数据的关键。 5. 安全审计和漏洞修复:定期进行安全审计和漏洞修复是保持加密算法的安全性的重要步骤。及时发现和修复潜在的安全漏洞可以防止攻击者利用这些漏洞来破解加密算法。 请注意,以上是一般性的信息和建议,具体的加密算法JS逆向安全控制实现需要根据具体情况进行详细分析和设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小谢同学~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值