杨记

碎片化学习令人焦虑,系统化学习使人进步

0%

python爬虫之协程

js常见加密算法

爬虫的js加密处理+js算法改写分析

js中常见的加密算法剖析

  • 线性散列Md5算法

  • 对称加密DES/AES算法

  • 非对称加密算法RSA

  • base64伪加密

  • https证书秘钥加密

可以处理的爬虫问题

  • 模拟登录中密码加密和其他请求参数加密处理

  • 动态加载且加密数据的捕获和破解

  • 重点:找寻到js算法加密和解密相关流程的编码于处理套路/技巧,大幅度提升处理相关问题的效率。

js常见的加密方式

  • 加密在前端开发和爬虫中是经常遇见的。掌握了加密算法且可以将加密的密文进行解密破解的,也是你从一个编程小白到大神级别质的一个飞跃。且加密算法的熟练和剖析也是很有助于帮助我 们实现高效的js逆向。下述只把我们常用的加密方法进行总结。不去深究加密的具体实现方式。

  • 常见的加密算法基本分为这几类,

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

MD5加密

  • MD5是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整的一致性。且MD5加密之后产生的是一个固定长度(32位或16位)的数据

  • 解密

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

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

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

  • 关键字 md5()

DES/AES加密

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

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

  • AES和DES的区别:

    • 加密后密文长度的不同:

      • DES加密后密文长度是8的整数倍
      • AES加密后密文长度是16的整数倍
    • 应用场景的不同

      • 企业级开发使用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即可
  • 关键字 CryptoJS

RSA加密

  • RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。

非对称加密算法:

  • 非对称加密算法需要两个密钥

    • 公开密钥( publickey简称公钥)
    • 私有密钥( privtekey简称私钥)
    • 公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
  • 注意:

    • 使用时都是使用公匙加密,使用私匙解密。公匙可以公开,私匙自己保留。
    • 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对 称加密解密的速度快。
  • 使用流程和场景介绍

    • 通过公匙加密,使用私匙解密。私匙是通过公匙计算生成的。假设ABC三方之间相互要进行加密通信。大家相互之间使用公匙进行信息加密,信息读取时使用各自对应的私匙进行信息解密
  • 用户输入的支付密码会通过RSA加密

  • 公钥私钥生成方式:

  • 关键字 setPuplicKey() setPrivateKey()

base64伪加密

  • Base64是一种用64个字符来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法。只是看上去像是加密而已。

  • Base64使用A—Z,a—z,0—9,+,/这64个字符实现对数据进行加密。

  • 关键字 Base64()

拓展:https加密

  • https是基于http和SSL/TLS实现的一个协议,他可以保证在网络上传输的数据都是加密的,从而保证数据安全。

  • 接下来我们从http协议开始,提出想法井逐步进行分析,最终实现Https.

1.http协议是不安全的。

  • 在https诞生之前,所有网站都使用http协议,而ht协议在数据传输的过程中都是明文,所以可能存在数据泄露和篡改。

2.使用对称秘钥进行数据加密

  • 为了防止数据泄露和篡改,我们对数据进行加密,如:生成一个对称密码【DKUFHNAF897123F】,将对称秘钥分别交给浏览器和服务器端,他们之间传输的数据都使用对称秘钥进行加密和解密。

请求和响应流程如下

  • 客户端使用对称秘钥对请求进行加密,并发送给服务端。

  • 服务端接收到密文之后,使用对称秘钥对密文进行解密,然后处理请求。最后再使用对称秘钥把要返回的内容再次加密,返回给客户端。

  • 客户端接收到密文之后,使用对称秘钥进行解密,并获取最终的响应内容。

如此一来,数据传输都是密文,解决了明文传输数据的问题。但是,这么干有bug

  • 浏览器如何获取对称秘钥

  • 每个客户端的对称秘钥相同,浏览器能拿到对称秘钥,那么黑客也可以拿到,所以,数据加密也就没有意义了

3.动态对称秘钥和非对称秘钥

  • 为了解决对称秘钥动态性以及让客户端和服务端安全的获取对称秘钥,可以引入非对称秘钥机制。

js调试工具

  • 发条js调试工具

PyExecJs

  • 实现使用python执行js代码

  • 环境安装:

    • nodejs开发环境
    • pip install PyExecJs

js算法改写初探

  • 打断点

  • 代码调试时,如果发现了相关变量的缺失,一般给其定义成空字典即可。

注意:如果需要逆向的js函数时出现在一个闭包中,那么直接将闭包的整个代码块拷贝出进行调试即可

js混淆:

  • 将js核心的相关代码进行变相的加密,加密后的数据就是js混淆之后的结果。

js反混淆:

  • 反混淆的线上工具(不理想)

  • 浏览器自带的反混淆工具设置(推荐)

    • 开发者工具的sources-》settings-》sources-》第一项勾上
    • 进行关键字的全局搜索-》VMxxxx(就是反混淆后的代码)

sessionid在抓包工具Application的Cookie中

欢迎关注我的其它发布渠道