常见加解密算法09 - HASH 算法

各位读者你们好啊,今天讨论一下 HASH 算法,也是这个系列的完结篇!!!

Hash算法,又称散列算法,是一种从任意长度的数据字符串中创建小的、固定长度的值的函数,该值通常被视为数据的“指纹”。不同的数据往往会通过散列算法产生不同的结果,若两个不同的数据通过同一散列函数产生了相同的结果(即散列冲突),这种情况是非常罕见的。

散列算法的关键特点包括:

  1. 确定性:相同的输入始终会产生相同的输出。

  2. 快速计算:计算任何给定数据的哈希值是快速的。

  3. 非逆性:理想中,从散列值中重建原始输入应该是不可行的,即散列函数是单向的。

  4. 冲突抵抗:两个不同输入很难产生相同的输出值。

固定的输出,这个是逆向研究的一个关键特征。

以下是几种常见散列算法:

  • MD5:产生一个128位(16字节)的哈希值,通常用一个32字符的十六进制数展示。MD5已经不再安全,容易受到冲突攻击。

  • SHA-1:安全散列算法(Secure Hash Algorithm)的第一个版本,产生一个160位(20字节)的哈希值。SHA-1比MD5更安全,但现在也认为它是不安全的。

  • SHA-256:属于SHA-2家族,产生一个256位(32字节)的哈希值,相比于SHA-1和MD5,它更安全。

  • SHA-512:是安全散列算法2(SHA-2)家族的一个成员,产生一个512位的哈希值。

  • SHA-3:最新的成员,提供与SHA-2不同的哈希算法和结构,针对各种不同的应用和环境提供多种输出大小。

CRC32

CRC32,全名为循环冗余校验码 32位 (Cyclic Redundancy Check 32-bit),是一种用于检测数字网络和存储设备上数据错误的校验算法。CRC32 通过将字节序列散列为 32 位的整数值来工作,其基于多项式除法的原理。在理论上,可以使用多种多项式来执行 CRC32,但在实际应用中通常只有两种被广泛使用。

CRC32 算法通过特定的多项式进行计算,生成一个数值,该数值随数据一同传输或存储。接收方在收到数据时,会使用同样的算法重新计算数据的 CRC32 值,若计算结果与传输来的 CRC32 值相匹配,则数据被认为是完好无误的。如果不匹配,则表明数据在传输或存储过程中可能遭受到了干扰或损坏。

CRC32 广泛应用于各种场合,例如以太网、FDDI、ZIP 文件和其他归档格式,以及 PNG 图像格式等。更深入的技术细节可以在各种技术文档或在线资源中找到。CRC算法的强大之处在于其检测随机错误的能力,尤其是在不需要错误修复(仅检测和报告)的场合中非常有用。

算法讲解:

https://www.bilibili.com/video/BV1V4411Z7VA/

Java版

    public static int getcrc32byapi(byte[] bytes) {CRC32 crc32 = new CRC32();crc32.update(bytes);return (int) crc32.getValue();}

Hook起来也非常的简单:

function hookCRC32() {if (Java.available) {Java.perform(function () {var CRC32Class = Java.use('java.util.zip.CRC32');CRC32Class.$init.implementation = function () {console.log("CRC32 constructor function is called");return this.$init();};CRC32Class.update.overload('[B').implementation = function (arg0) {console.log("CRC32->update:", JSON.stringify(arg0));var result = this.update(arg0);return result;};CRC32Class.update.overload('java.nio.ByteBuffer').implementation = function (arg0) {console.log("CRC32->update.overload('java.nio.ByteBuffer'):", JSON.stringify(arg0));var result = this.update(arg0);return result;};CRC32Class.update.overload('int').implementation = function (arg0) {console.log("CRC32->update.overload('int'):", JSON.stringify(arg0));var result = this.update(arg0);return result;};CRC32Class.update.overload('int', 'int').implementation = function (arg0, arg1) {console.log("CRC32->update.overload('int', 'int'):", arg0, '---', arg1);var result = this.update(arg0, arg1);return result;};CRC32Class.update.overload('[B', 'int', 'int').implementation = function (arg0, arg1, arg2) {console.log("CRC32->update:", JSON.stringify(arg0), "---:", "---", arg1, "---", arg2);var result = this.update(arg0, arg1, arg2);return result;};CRC32Class.getValue.implementation = function () {var result = this.getValue();console.log("CRC32->getValue:", result);return result;};})}
}

C版

算法识别也可以使用 findcrypt 脚本,因为它也有一个常量表。CRC32常量表是用于计算CRC32校验值的预计算值表,它包含256个32位的条目。每个条目代表一个八位数的CRC值。这个表可以在运行时生成,但通常为了提高效率,会预先计算并存储使用。

rule CRC32_poly_Constant {meta:author = "_pusher_"description = "Look for CRC32 [poly]"date = "2015-05"version = "0.1"strings:$c0 = { 2083B8ED }condition:$c0
}

看一个实现:

static  uint32_t crc32_table[] FLASH_PROGMEM = {0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
};

里面就有 0xedb88320 这个会命中规则。

MD5

给大家讲两个笑话:

  1. 某网站用字符串的哈希值来记录用户密码,后来网站升级,.NET 2.0升级为.NET 3.5,微软改了字符串取哈希值的算法,导致密码库失效,用户无法登陆,不得已网站又退回了.NET 2.0。

  2. 第二个笑话,某度网盘用哈希值检查文件实现秒传。结果有段时间有人发现秒传上传的根本不是自己的文件。

    public static String md5(String content) {try {MessageDigest digest = MessageDigest.getInstance("MD5");byte[] bytes = digest.digest(content.getBytes());String result = Base64.encodeToString(bytes, 0);return result;} catch (Exception ex) {ex.printStackTrace();return "";}}

SHA-1/SHA-256

    public static String sha1(String content) {MessageDigest md = null;String strDes = null;byte[] bt = content.getBytes();try {md = MessageDigest.getInstance("SHA-1");// 将此换成SHA-1、SHA-512、SHA-384等参数md.update(bt);byte[] result = md.digest();strDes = Base64.encodeToString(result, 0);} catch (NoSuchAlgorithmException e) {return null;}return strDes;}

MD5与SHA-1/SHA-2都是有常量表的,可以使用 findcrypt 来识别。

例子

使用脚本识别到了一个常量,但是没有直接引用,说明识别到了常量表的中间部分,往上找到该数据段的头部,按 X 找到引用位置。

一层一层往上找,就能找到对应的入口了,然后使用 frida hook,重放, 确定函数即可。

二手的程序员

欢迎关注二手的程序员,这里主要分享逆向相关的知识。专注于完整系列,让知识不再碎片化。不定时更新,也欢迎关注我的博客:lyldalek.top

公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/52531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机快速入门之点灯 STC 51单片机

第一步创建工程 第二步加载头文件 第三步编写代码 点灯完成 解释:主函数为main() 内部P1控制的是p1.0-p1.7 引脚 0为低电平

云计算实训41——部署project_exam_system项目(续)

# 创建脚本,可以在java环境中运行任何的jar包或者war包#!/bin/bash/usr/local/jdk/bin/java -jar /java/src/*.?ar一、思路分析 (1)nginx 1、下载镜像,将本地的dist项目的目录挂载在容器的/usr/share/nginx/html/ 2、启动容器 …

freertos 任务调度—抢占式, 时间片

FreeRTOS 操作系统支持三种调度方式: 抢占式调度,时间片调度和合作式调度。 实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少. 1,抢占式调度 每个任务都有不同的优先级, 任务会一直运行直到被高优先级任务抢占或者遇到…

【MySQL】查询语句之inner、left、right、full join 的区别

前言: INNER JOIN 和 OUTER JOIN 是SQL中常用的两种连接方式,用于从两表活多表中提取相关的数据。两者区别主要在于返回的 结果集 如何处理 匹配 与 不匹配 的行。 目录 1、INNER JOIN 2、OUTER JOIN 3、总结 1、INNER JOIN 称为内连接,只…

SVGJS操作

svgjs用于操作 SVG 和动画的轻量级库。 官网 SVG.js v3.2 |家 (svgjs.dev) 效果 代码如下 <template><h3>测试操作已有SVG</h3><button click"changeText()">利用ID定位</button><button click"changeChild()">chan…

【Hot100】LeetCode—322. 零钱兑换

目录 1- 思路动态规划 2- 实现⭐322. 零钱兑换——题解思路 3- ACM 实现 原题链接&#xff1a;322. 零钱兑换 1- 思路 动态规划 动规五部曲 1- 定义 dp 数组确定含义 dp[j] 代表凑到金钱为 j 的最少硬币个数 2- 递推公式 dp[j] Math.min(dp[j],dp[amount-]1) 3- 初始化 dp[…

【苍穹外卖】前端 Day 1

1 Vue 1.1 通过 vue cli 脚手架创建前端工程 1.2 项目结构 1.3 启动项目 VS Code 启动前端项目&#xff1a; npm run serve 注意这里占用端口号 8080 与 java springboot 占用端口号一致&#xff0c;有冲突 serve 是这个名字 终止&#xff1a;ctrl c 修改端口号 2 vue 基本…

信刻光盘安全隔离与信息交换系统

随着各种数据传输、储存技术、信息技术的快速发展&#xff0c;保护信息安全是重中之重。军工、政府、部队及企事业单位等利用A网与B网开展相关工作已成为不可逆转的趋势。针对于业务需要与保密规范相关要求&#xff0c;涉及重要秘密信息&#xff0c;需做到安全的物理隔离&#…

离线版问卷-可集成到现有系统

目录标题 离线版问卷&#x1f4a1;前言亮点场景题外话 &#x1f3a8; 预览&#x1f308; 技术栈&#x1f4e6; 仓库&#x1f4bb; 初始化&#x1f680; 启动&#x1f6e0;️ 打包&#x1f5c2; 目录结构✨ 使用方法集成【设计问卷】集成【填写问卷】集成【只读问卷】集成【填答…

省委书记邀约大学生创业,长沙又一次为年轻人沸腾

敢想敢做的大学生&#xff0c;一直是创新创业的主力军。尤其是这些年“学术型”创业团队在各行各业越来越多见&#xff0c;市场对他们的接纳和支持力度也越来越强&#xff0c;给了新一代的大学生们更大的底气。 以往&#xff0c;大学生创业经常“落地生根”&#xff0c;先搞事…

【编译原理】编译器概述、编译器结构、编译器实例

编译器概述、编译器结构、编译器实例 编译器概述 1.编译器是一个程序 核心功能是把源代码翻译成目标代码 比如源代码&#xff1a;C/C&#xff0c;Java&#xff0c;C#&#xff0c;html 目标代码&#xff1a;X86&#xff0c;IA64,ARM,… 把一种源程序翻译成另外一种源程序&…

Facebook的秘密算法:如何提升你的社交体验

在数字时代&#xff0c;社交媒体平台已经成为我们日常生活的重要组成部分。作为全球最大的社交网络之一&#xff0c;Facebook通过其复杂的算法&#xff0c;影响着亿万用户的社交体验。这些算法不仅决定了我们在平台上看到的内容&#xff0c;还在背后默默优化我们的互动方式。本…

[数据集][目标检测]汽车头部尾部检测数据集VOC+YOLO格式5319张3类别

数据集制作单位&#xff1a;未来自主研究中心(FIRC) 版权单位&#xff1a;未来自主研究中心(FIRC) 版权声明&#xff1a;数据集仅仅供个人使用&#xff0c;不得在未授权情况下挂淘宝、咸鱼等交易网站公开售卖,由此引发的法律责任需自行承担 数据集格式&#xff1a;Pascal VOC格…

SpringSecurity剖析

1、SpringSecurity 入门 1.1、简介 Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的实际标准。Spring Security是一个框架&#xff0c;致力于为Java应用程序提供身份验证和授权。与所有Spring项目一样&#xff0c;Sp…

红帽RHCE认证值不值得考?RHCE认证有什么用?

在IT行业&#xff0c;红帽认证作为一项衡量Linux技能水平的重要标准&#xff0c;受到了广泛的关注和认可。 拥有一张权威认证证书无疑是提升自身竞争力、实现职业发展的重要途径。 RHCE认证作为Linux领域的顶级认证之一&#xff0c;其价值和意义不言而喻。 那么&#xff0c;…

PowerBi 柱形图,数据标签无法显示在端外

如图 即使设置了“数据标签”显示“端外“&#xff0c;仍然不作用。 原因其实是因为Y轴的数据范围设置不当&#xff0c;如图&#xff0c;当前Y轴范围是0到自动 只需要修改为最大和最小值都是自动即可&#xff0c;选中0 按backspace键删除&#xff0c;然后&#xff0c;鼠标在任意…

排班系统|基于Springboot+vue的医护人员排班系统(源码+数据库+文档)

排班系统|医护人员排班系统 目录 基于Springbootvue的医护人员排班系统 一、前言 二、系统设计 三、系统功能设计 医护类型管理 排班类型管理 科室信息管理 医护信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

C语言代码练习(第十八天)

今日练习&#xff1a; 48、猴子吃桃问题。猴子第1天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。第2天早上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时&…

【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)

文章目录 PyQt5超详细教程前言第7部分&#xff1a;生成图表与数据可视化7.1 matplotlib 与 PyQt5 的结合7.2 在 PyQt5 中嵌入 matplotlib 图表示例 1&#xff1a;嵌入简单的 matplotlib 图表代码详解&#xff1a; 7.3 动态生成图表示例 2&#xff1a;动态更新图表代码详解&…

电脑与电脑之间怎么快速传输文件?

若两台电脑在同一局域网&#xff0c;可以使用Windows远程桌面传输文件&#xff0c;或者使用远程看看这款免费的远程桌面软件&#xff0c;它支持在不同的网络之间传输文件&#xff0c;而且速度快、安全性高。 步骤1. 在两台电脑上下载、安装并运行远程看看。 步骤2. 注册一个远…