提示:本文案列分享中的关键信息已做Base64编码处理载要算法 在JavaScript中和Python中的基本实现方法,遇到JS加密的时候可以快速还原加密过程,有的网站在加密的过程中可能还经过了其他处理,但是大致的方法是一样的。 消息摘要算法签名算法:MD5、SHA、HMAC1、MD5 简介:全称MD5消息摘要算法,又称哈希算法、散列算法,由美国密码学家罗纳德李维斯特设计,于1992年作为RFC1321被公布,用以取代MD4算法。摘要算法是单向加密的,也就是说明文通过摘要算法加密之后,是不能解密的。摘要算法的第二个特点密文是固定长度的,它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。之所以叫摘要算法,它的算法就是提取明文重要的特征。所以,两个不同的明文,使用了摘要算法之后,有可能他们的密文是一样的,不过这个概率非常的低。JavaScript实现 安装模块npminstallcryptojssave 使用案例引用cryptojs加密模块varCryptoJSrequire(cryptojs)functionMD5(){vartextIlovepython!returnCryptoJS。MD5(text)。toString()}console。log(MD5())Python实现importhashlibdefmd5():md5hashlib。md5()md5。update(Ilovepython!。encode(utf8))print(md5。hexdigest())ifnamemain:md5() 总结:MD5哈希将其视为十六进制数,MD5哈希长度为128位,通常由32个十六进制数字表示。2、SHA 简介:全称安全哈希算法,由美国国家安全局(NSA)所设计,主要适用于数字签名标准里面定义的数字签名算法,SHA通常指SHA家族的五个算法,分别是SHA1、SHA224、SHA256、SHA384、SHA512,SHA是比MD5更安全一点的摘要算法,MD5的密文是32位,而SHA1是40位,版本越强,密文越长,代价是速度越慢。JavaScript实现引用cryptojs加密模块varCryptoJSrequire(cryptojs)functionSHA1Encrypt(){vartextIlovepython!returnCryptoJS。SHA1(text)。toString();}console。log(SHA1Encrypt())Python实现importhashlibdefsha1():sha1hashlib。sha1()sha1。update(Ilovepython!。encode(utf8))print(sha1。hexdigest())ifnamemain:sha1()3、HMAC 简介:全称散列消息认证码、密钥相关的哈希运算消息认证码,于1996年提出,1997年作为RFC2104被公布,HMAC加密算法是一种安全的基于加密Hash函数和共享密钥的消息认证协议,它要求通信双方共享密钥key、约定算法、对报文进行Hash运算,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。JavaScript实现引用cryptojs加密模块varCryptoJSrequire(cryptojs)functionHMACEncrypt(){vartextIlovepython!varkeysecret密钥文件returnCryptoJS。HmacMD5(text,key)。toString();returnCryptoJS。HmacSHA1(text,key)。toString();returnCryptoJS。HmacSHA256(text,key)。toString();}console。log(HMACEncrypt())Python实现importhmacdefhmact1():messagebIlovepython!keybsecretmd5hmac。new(key,message,digestmodMD5)print(md5。hexdigest())defhmact2():keysecret。encode(utf8)sha1hmac。new(key,digestmodsha1)sha1。update(Ilove。encode(utf8))sha1。update(Python!。encode(utf8))print(sha1。hexdigest())ifnamemain:hmact1()9c503a1f852edcc3526ea56976c38edfhmact2()2d8449a4292d4bbeed99ce9ea570880d6e19b61a4、实战案例1案例md5加密逆向逆向目标站点:aHR0cDovL2ZhbnlpLnlvdWRhby5jb20vCg逆向字段:sign逆向分析先进行抓包,可以看到有一个签名信息sign sign1数据加密位置 signjs算法python代码模拟 salt:16173416736376时间戳 sign:d804b70f25ba8faf6196c1881af5e277签名 解析:n。md5(fanyideskwebeiTbh5E8q6U3EXeL〔4c) e待翻译字符串 i时间戳 salt:16173416736376时间戳随机的10以内整数importhashlibimportrequests,time,randomimportmathclassCrawl():definit(self):self。headers{Cookie:OUTFOXSEARCHUSERID32207657010。169。0。83;JSESSIONIDaaaZhLm5ZNK87a08TerIx;OUTFOXSEARCHUSERIDNCOO1158799533。2810698;rltestcookies{}。format(math。ceil(time。time()1000)),UserAgent:Mozilla5。0(WindowsNT10。0;Win64;x64)AppleWebKit537。36(KHTML,likeGecko)Chrome89。0。4389。90Safari537。36,}self。urlaHR0cDovL2ZhbnlpLnlvdWRhby5jb20vdHJhbnNsYXRlX28c21hcnRyZXN1bHQ9ZGljdCZzbWFydHJlc3VsdD1ydWxlCgdefspider(self,key):timesstr(math。ceil(time。time()1000)random。randint(1,10))signself。Md5(fanyideskwebkeystr(times)Tbh5E8q6U3EXeL〔4c)data{i:key,from:AUTO,to:AUTO,smartresult:dict,client:fanyideskweb,salt:times,sign:sign,lts:times〔:1〕,bv:cda1e53e0c0eb8dd4002cefc117fa588,doctype:json,version:2。1,keyfrom:fanyi。web,action:FYBYREALTlME}resrequests。post(self。url,datadata,headersself。headers)。json()ifres。get(errorCode)0:print(执行的结果:res。get(translateResult)〔0〕〔0〕〔tgt〕)defMd5(self,value):mdhashlib。md5()md。update(value。encode(utf8))接收字节类型16进制表示returnmd。hexdigest()ifnamemain:whileTrue:sinput(请输入:)Crawl()。spider(s)ifsexit:break2案例sha256系列 逆向目标站点:aHR0cDovL3d3dy5oaDEwMjQuY29tLwo逆向参数:sign抓包分析:通过对比,可以发现这个参数每次都会切换 sign2调试加密地点打开全局搜索sign关键字 sign关键点参数加密地点 sign算法实现定位python代码实现importurllib3,requests,time,jsonurllib3。disablewarnings()importhashlibdefgetsign():timesstr(int(time。time())1000)params{no:dy0002,data:{days:1,rankType:5,liveDay:f2022{months。zfill(2)}{days。zfill(2)}}}ddjson。dumps(params)datafparam{dd}tamp{times}tenant1saltkbn)?FGkfs8sdf4Vg1;kf5ndl39;要进行加密的数据datashahashlib。sha256(data。encode(utf8))。hexdigest()returndatashadefgetdata():sgetsign()datas{param:dd,sign:s,tenant:1,timestamp:times,token:t}urlaHR0cHM6Ly91Y3AuaHJkanl1bi5jb206NjAzNTkvYXBpL2R5Cgressession。post(url,headersheaders,datajson。dumps(datas))ifres。json()。get(status)0:datares。json()。get(data)〔rankList〕fordindata:items{}items〔dy名〕d。get(anchorName)items〔带货销量〕。2f(d。get(salesVolume)10000)万items〔带货销售额〕。2f(d。get(salesMoney)1000000)万items〔粉丝〕。2f(d。get(fans)10000)万items〔在线人数〕。2f(d。get(online)10000)万items〔时间〕d。get(liveDay)print(items)ifnamemain:monthsinput(请输入查询月份:)daysinput(请输入查询日期,2天以内:)getdata()