MD5、SHA1、SHA256的简单讲解

2023-12-25 18:12
文章标签 简单 讲解 md5 sha256 sha1

本文主要是介绍MD5、SHA1、SHA256的简单讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简述:

最近在研究系统以及驱动,当下载比较大的文件时总会提供SHA1或者SHA256,下载结束后使用校验工具得到的值与它进行比对来判断下载是否成功。
在这里插入图片描述

使用工具校验

certutil -hashfile 文件名 sha1/sha256/md5

在这里插入图片描述

正文:

MD5、SHA1、SHA256这些都被称为 哈希函数或散列函数。这些算法的最大的特点是不可逆。也就是不能从结果值去推演出初始值。

运算过程:

这里举个简单例子来讲解一下为什么不可逆。假如我们要对 1234567890 这串字符进行哈希运算。

  1. 只取偶数位的值: 既得到 24680

  2. 对每个数字都进行+1, 得到 35791

  3. 然后只截取前面三位数字: 得到 357

从这个简单的运算后得到 357 的结果,很明显是不可能反推出我们初始值 1234567890 的(不可逆)

可以肯定的是按照这个运算过程 1234567890 得出的结果一定是 357。(结果位数固定)

但应该很多人都发现了一个问题,我只要保证前面三个偶数位的值是246,其他随便怎么变。它最终的结果都是357。

没错!!!

哈希函数都有这个特点,对不同的数据加密,一定会有产生相同结果的值,这个也被称为碰撞。

我们可以输入的数据是无穷的(不管图片、视频、文件、各种字符…在计算机里无非都是0和1罢了),而用几十位数值作为输出,那肯定是会有重复的结果。

对于我上面模拟的哈希函数,那碰撞性可就太大了。那么优化一下,我在第三步截取改为前面5位数字,那么碰撞性是不是变小了?

差异:

这也算是MD5、SHA1、SHA256之间最大的差别:

  • MD5的长度为(128 bit) 32个十六进制值

  • SHA1的长度为(160 bit) 40个十六进制值

  • SHA256的长度为(256 bit) 64个十六进制值

拓展:(4bit=1hex十六进制值,8bit=1Byte)

安全性: SHA256 > SHA1 > MD5

计算速度: MD5 > SHA1 > SHA256

当然它们的加密过程肯定是不一样,不然怎么可能产生不同的结果呢。不过总得来说它们三者的加密过程还是很相似的,换汤不换药。

哈希加密的运用场景:

1.存储用户密码

假设我们用某个软件,储存密码的时候都是明文。那么如果该软件的数据库被黑客入侵了或者有内鬼(终止交易)。那么我们的账号密码不是直接就暴露了?但是用了哈希加密就不一样。因为这个哈希值是不可逆的,即使密码被泄露,也不用担心我们实际的密码被人知道。

2.文件校验

下载某xx文件,假如服务器在国外速度特别慢,我们可能去找国内的一些网站下载。这有个风险,你怎么知道文件有没有被修改过?是不是加了个病毒木马?这里就可以用哈希值去校验,如果官网提供的值跟你运算出来的一样,则没有被修改过。

…(太多自己发挥想象力)

常见问题:
1.为什么有些网站可以解密MD5值?

实际上这并不是真正意义上的解密,而是把大家常用的语句、密码进行MD5加密把结果存储在数据库里。当你拿个MD5值去解密的时候,它就会去找数据库看看有没有这个值。如果有就给你返回结果,如果没有就解密失败。直白点说,你设置的密码太弱鸡了。
2.什么是加盐?

我的密码就爱设置为123456,怎么滴。不能为难用户,那就为难程序员。在MD5上加些其他的运算过程,比如得到最终结果的MD5以后,我把所有的A替换成F,1替换成9。那即使密码泄露了。因为不是最原始的MD5,即使是弱口令,不知道替换规则,那么也是破解不出来的。这种行为就被称为加盐。

这篇关于MD5、SHA1、SHA256的简单讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/536452

相关文章

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

MySQL连表查询之笛卡尔积查询的详细过程讲解

《MySQL连表查询之笛卡尔积查询的详细过程讲解》在使用MySQL或任何关系型数据库进行多表查询时,如果连接条件设置不当,就可能发生所谓的笛卡尔积现象,:本文主要介绍MySQL连表查询之笛卡尔积查... 目录一、笛卡尔积的数学本质二、mysql中的实现机制1. 显式语法2. 隐式语法3. 执行原理(以Nes

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、