首页 > 编程语言 >JavaScript逆向之md5算法

JavaScript逆向之md5算法

时间:2024-03-05 10:45:21浏览次数:29  
标签:逆向 obj 函数 JavaScript mysticTime 算法 func md5

md5算法

md5算法简介:md5算法是一种摘要算法,主要用来进行数字签名、文档一致性验证等。

python实现md5

点击查看代码
from hashlib import md5
s="123456"
obj = md5()
# 把你要计算的字节丢进去
obj.update(s.encode("utf-8"))
md5_value = obj.hexdigest()     
print(md5_value)  # e10adc3949ba59abbe56e057f20f883e
如果想把计算md5值作为一个方法进行封装,需要考虑以下两种封装方式: (1)第一种,创建md5算法的声明变量在方法之外
点击查看代码
from hashlib import md5

obj = md5()
def func(s):
    obj.update(s.encode("utf-8"))
    md5_value = obj.hexdigest()     # 第一次是"樵夫"的md5值,第二次是"樵夫樵夫"的md5值
    print(md5_value)

func("123456")  # e10adc3949ba59abbe56e057f20f883e
func("123456")  # ea48576f30be1669971699c09ad05c94
可以看到这种声明方式,计算"123456"的md5值的结果都不一样,这是为什么呢?因为md5算法的声明变量在方法之外,每次调用func函数计算md5值的时候用的都是同一个变量,第一次调用func函数计算的确实是"123456"的md5值,而第二次调用func函数计算的就是"123456123456"的md5值了,所以这种方法不可取。 (2)第二种,创建md5算法的声明变量在方法内
点击查看代码
from hashlib import md5

def func(s):
    obj = md5()
    # 把你要计算的字节丢进去
    obj.update(s.encode("utf-8"))
    md5_value = obj.hexdigest()     # 第一次是"樵夫"的md5值,第二次是"樵夫樵夫"的md5值
    print(md5_value) 

func("123456")  # e10adc3949ba59abbe56e057f20f883e
func("123456")  # e10adc3949ba59abbe56e057f20f883e
这种才是正确的将计算md5值进行封装的写法。

md5算法加盐

MD5算法加盐其实就是在你想要加密的明文的前面或者后面加上一段字符串,是用来解决撞库问题的。
我们可以通过一段代码来验证。

点击查看代码
from hashlib import md5

obj1 = md5(b'1234')    # 设置盐
obj1.update('love'.encode("utf-8"))
md5_value1 = obj1.hexdigest()
print(md5_value1)    # f5939b22f92b4a71e39c0281764c36ed
obj2 = md5()
obj2.update('1234love'.encode("utf-8"))
md5_value2 = obj2.hexdigest()
print(md5_value2)    #f5939b22f92b4a71e39c0281764c36ed
从代码中可以看出,python实现加盐的原理是将盐加在我们想要加密的明文之前的。 其余的摘要算法,如sha1,sha256,sha512的用法与md5一致,都位于hashlib库下,只需要将其引入即可。

总结:如果在网站上看到一些加密逻辑,发现计算的结果是32位字符串,并且该字符串的组成是0-9a-f,可以大胆猜测是md5算法。然后尝试将123456传递进去,如果结果是e10开头的,那么他就是标准的md5算法,就可以直接写python代码了。但是如果计算的结果不是e10,那就有可能是魔改的md5算法了,这种就需要一步一步去抠代码。

有道翻译——md5逆向

为了能够加深印象,用有道翻译来实践一下。
url:https://fanyi.youdao.com/index.html#/
访问url地址,打开开发者工具,随便输入一个单词,看会触发哪些流量(还是只看Fetch/XHR的流量就可以了)。

查看每一条流量的payload。


这两条流量的payload都存在我们不能理解的参数,应该是被加密过了。接下来就是看其如何加密的,这里就以webtranslate/key这条流量为例进行操作。
寻找加密过程有两种方法,一个是看initiator,一个是搜索关键词,为了方便,这里就通过搜索关键词来定位。
那么如何来选取关键词呢,第一种就是通过搜索url中的关键词,第二种这里还可以搜索参数关键词,例如sign和mysticTime。这里就通过搜索url关键词了。

找到一条记录。

打上断点。

通过快捷键ctrl+shift+r来刷新界面。

经过一个一个变量的查看,都没有看到payload中的关键词,最后定位在了E函数上面,跳转到声明E函数的地方。

E函数中明显出现了sign、mysticTime等关键词,在函数的第三行打上断点,跳转到E函数内。

变量o就是获取当前时间戳,再将变量o赋值给mysticTime,所以mysticTime其实就是时间戳。下面主要来看sign是如何生成的,sign=k(o,e),看下k函数是如何实现的。

k函数调用了j函数,再看j函数如何实现。

j函数是用来生成md5值的。那其实就是k函数将模板字符串传递给j函数,生成md5值后赋值给sign。看下模板字符串的组成。
client=${u}&mysticTime=${e}&product=${d}&key=${t}
四个参数,client、mysticTime、product、key,其中client,product,key三个是定值,mysticTime是时间戳。

直到了如何计算md5值,python代码就很好写了。

点击查看代码
import requests
from hashlib import md5
import time

t = int(time.time() * 1000)  # 获取时间戳
obj = md5()
obj.update(f"client=fanyideskweb&mysticTime={t}&product=webfanyi&key=asdjnjfenknafdfsdfsd".encode("utf-8"))
sign = obj.hexdigest()
params = {
    "keyid": "webfanyi-key-getter",
    "sign": sign,
    "client": "fanyideskweb",
    "product": "webfanyi",
    "appVersion": "1.0.0",
    "vendor": "web",
    "pointParam": "client,mysticTime,product",
    "mysticTime": t,
    "keyfrom": "fanyi.web"}
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 "
                  "Safari/537.36",
    "Referer": "https://fanyi.youdao.com/",
    "Cookie": "OUTFOX_SEARCH_USER_ID_NCOO=85258406.52079003; [email protected]",
}

resp = requests.get("https://dict.youdao.com/webtranslate/key", headers=headers, params=params)
print(resp.text)

这样即可取得数据。

标签:逆向,obj,函数,JavaScript,mysticTime,算法,func,md5
From: https://www.cnblogs.com/sbhglqy/p/18053475

相关文章

  • Javascript Object 中,isExtensible/isSealed/isFrozen 的对比
    目录isExtensibleisSealedisFrozen示意图isExtensibleextensibleobject的定义:theycanhavenewpropertiesaddedtothem,andtheir[[Prototype]]canbere-assigned.Anobjectcanbemarkedasnon-extensibleusingoneofObject.preventExtensions(),Object.seal......
  • 黑马程序员JavaWeb学习笔记-JavaScript
    JavaScript--JavaScript引入方式--书写语法--输出语句window可以省略--变量var特点1:作用域比较大,全局变量特点2:可以重复定义--数据类型原始数据类型相当于java中基础数据类型alert(parseInt("12"));//12alert(parseInt("12A45"));//12alert(parseInt("A4......
  • 了解JavaScript 调用堆栈
    每个javascript执行环境都有一个调用堆栈。该调用堆栈用于跟踪函数调用。堆栈是一种后进先出(LIFO)的简单数据结构。我们可以从堆栈中取出的顶部元素是我们压入堆栈的最后一个元素。对于JavaScript调用堆栈,这些元素是函数引用。由于JavaScript是单线程的,因此只有一个堆......
  • 【JS逆向百例】某词霸翻译逆向分析
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作......
  • 关于台历程序的逆向编程与改进
    1.来源https://zhuanlan.zhihu.com/p/3963903242.运行环境VSCODEc语言运行结果:3.主要问题:用户不可以自定义显示自己想要查看的年份月份不同国家的用户兼容性缺失代码不够模块化,扩展性不足改进:添加了用户输入功能,用户可以输入特定的年份和月份来显示指定月份的日历。......
  • 初识JavaScript逆向——以网易云音乐和招标网站为例
    前言:需要掌握一定的JavaScript基础,能看懂基础的JavaScript代码。我们平常在浏览网站的时候会看到许多加密的参数,如果需要知道它的原始数据,就需要知道整个加密过程,所以本篇文章就来介绍一下本人在初学逆向的时候一些笔记。想要获取加密过程大概来说有以下两个方法:(1)通过浏览器的i......
  • 前端 xlsx js javascript 处理excel 数据展示 日期格式处理
     1、参考https://blog.csdn.net/Seven71111/article/details/107375712https://blog.csdn.net/weixin_44987713/article/details/130129282 https://blog.csdn.net/qq_57952018/article/details/134812452 2、存在的问题a、千年虫b、定义一个转换日期格式的方法(转成......
  • 矩阵爆破逆向之条件断点的妙用
    不知道你是否使用过IDA的条件断点呢?在IDA进阶使用中,它的很多功能都有大作用,比如:ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大,配合IDA-python的输出语句能够大杀特杀!那么本文就介绍一下这个功能点,使用z3来秒解题目。条件断点什么是条件断点呢?条件断点(ConditionalBrea......
  • 写少一点/ARCHITECTURE/JavaScript类型转换/Logitech Options一直转圈
    《写少一点》https://www.yuque.com/beilo/simpread/1709260496568《ARCHITECTURE文件》https://www.yuque.com/beilo/simpread/1709260486335例子https://github.com/rust-lang/rust-analyzer/blob/d7c99931d05e3723d878bea5dc26766791fa4e69/docs/dev/architecture.md《Java......
  • JavaScript事件
    键盘事件:keypress键盘事件,keyup抬起,keydown按下文档:load加载表单:focus获得焦点,blur失去焦点,submit提交事件,change改变事件其他:scroll滚动事件,selectstart选择事件1.event事件对象常见的属性和方法e.target返回触发事件的对象标准e.srcElement返回触发事件的对象......