单向散列函数——获取消息的 “指纹”

news2024/11/23 12:38:17

目录

  • 什么是单向散列函数
  • 散列算法的特征
  • 散列算法的用途
  • 散列算法的分类
    • 密码学哈希和非密码学哈希
    • 不安全的密码学哈希算法
    • 主流的密码学哈希算法
  • SHA256散列算法(SHA2算法)
    • SHA256算法过程
    • SM3散列算法
  • 应该使用哪种单向散列函数呢

什么是单向散列函数

单向散列函数( one-way hash function )有一个输入和一个输出,其中输人称为消息( message ),输出称为散列值( hash value )。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。
在这里插入图片描述
消息不一定是人类能够读懂的文字,也可以是图像文件或者声音文件。单向散列函
数不需要知道消息实际代表的含义。无论任何消息,单向散列函数都会将它作为单纯的比特序列来处理,即根据比特序列计算出散列值。

散列值的长度和消息的长度无关。无论消息是 1 比特,还是 100MB,甚至是 100GB, 单向散列函数都会计算出固定长度的散列值。以 SHA256 单向散列函数为例,它所计算出的散列值的长度永远是 256 比特( 32 字节 )

散列算法的特征

散列算法具有以下特征:

  1. 散列算法具有不可逆性,即,无法有效地通过散列值逆推明文。
  2. 散列算法的明文通常可以很长,而散列值则固定长度。
  3. 相同的明文产生相同的散列值,如果两个明文的散列值不同,那么这两个明文一定不同。
  4. 不同的明文大概率产生不同的散列值,但依然有较小的概率产生相同的散列值。这叫哈希碰撞/散列碰撞/哈希冲突/散列冲突。
  5. 一个明文少许改变部分输入,那么会产生一个完全不同的散列值。这叫雪崩效应,是密码学中混淆与扩散原则的体现。

散列算法的用途

由于散列算法所具备的特征,它常常被用于以下场景:

  1. 网络传输的校验和: 在网络传输(比如从网站下载资源)过程中,为了避免传输过程中发生数据丢包等问题,网站往往会提供一个对应下载文件的校验和文件,这个校验和文件就是目标文件的散列值,于是在客户端下载完目标文件后,只要用相同算法对下载到本地的文件做一次散列计算,然后与网站提供的校验和文件进行对比,就能确定下载好的文件是否与网站上的文件一致。
  2. 确保传递消息的真实性与完整性: 类似校验和,发送消息的一方将原消息与其散列值一起发送,接收方通过验证原消息的散列值与接收到的散列值是否一致来确保消息的真实性与完整性。实际的安全网络传输中当然不会如此原始简单,比如tls通信中,在握手完成后的通信中就用到了散列函数来验证消息,但并不是简单的直接使用散列,而是结合握手时协商好的相关密钥对消息做认证码(MAC)验证。
  3. 电子签名:电子签名一般用于网络中的身份验证,由数字签名算法实现。而数字签名算法中往往需要一个散列函数对签名主体先做一次摘要计算,在提高安全性的同时,也确保了签名内容不会过长。(数字签名的一个特点是签名内容越长,签名就越长。)
    保存敏感资料如密码: 在服务端保存用户密码等敏感资料时,可以利用散列的特性进行保存,在无法逆推明文的基础上,可以通过散列计算验证密码是否正确。
  4. 散列表实现快速查找: 即HashTable,利用key的散列值映射到内存地址从而快速读写value。HashTable的场景,对散列计算速度要求较高,而对散列碰撞的要求相对较低,因此两个不同key计算到同一个内存地址上的概率相对较大。因此HashTable的实现,比如Java的HashMap,对哈希冲突的场景都做了特殊处理(同一地址上用链表或红黑树结构存储)。

散列算法的分类

散列算法一般可以被分为密码学哈希算法和非密码学哈希算法;密码学哈希算法中又可以分为安全的算法和不安全的算法;另外还有一种特殊用途的抗ASIC哈希算法。

密码学哈希和非密码学哈希

散列算法一般被分为密码学哈希和非密码学哈希。

所谓密码学哈希,英文是Cryptographic Hash Function,指的是用于保证密码学安全性的散列算法。所谓保证密码学安全性,是指很难发生哈希碰撞,或者很难被找出散列前的明文,并且散列值表现出随机性。密码学哈希的关键指标是抗碰撞性,也就是发生哈希碰撞的可能性。抗碰撞性越好,发生碰撞的可能性就越低,也就越安全。在使用密码学哈希时,一般都会将密码学哈希不会发生碰撞作为设计前提。

而非密码学哈希,只是尽量避免非恶意输入带来的哈希碰撞,对抗碰撞性的要求并不高。比如检测数据中的意外变化(CRCs, 循环冗余校验),或者HashTable中将不同的对象快速分配到不同的地址空间,这些场景并不要求不能发生碰撞,只要尽量较少碰撞就可以了。

判断一个哈希算法是不是密码学哈希的原则是,看它设计出来的目的是什么,是否是要确保密码学安全性,即拥有足够高的抗碰撞性。

以HashTable为例,它对散列计算的速度要求远大于抗碰撞性要求,所以采用的就是某个很简单的非密码学哈希算法。比如java的HashMap所采用的散列算法,就是遍历对象的每个字节不断乘以一个质数(31)再叠加。

非密码学哈希只能用在数据校验、HashTable等对抗碰撞性要求低的场景,而密码学哈希的应用场景不但有数据校验,还有电子签名、密码保存、数据指纹、伪随机数生成等场景。

不安全的密码学哈希算法

对于密码学哈希,使用时是假设它不会发生碰撞的。但如果一个密码学哈希算法被证明在当下计算机的计算能力内出现碰撞的可能性较高,或出现过碰撞,就会被标记为不安全的密码学哈希算法了,将不再被推荐作为密码学哈希算法使用。比如MD5算法,它最开始是作为密码学哈希被设计出来的,但随着计算机能力的发展,MD5被证明实际出现碰撞的可能性较大,于是MD5就被标记为不安全的密码学哈希算法,实际上只能在很有限的一些场景里作为非密码学哈希来使用。

目前被证明不安全或安全性有争议的密码学哈希算法: MD5、SHA-0系列、SHA-1系列等等。(MD5 的强抗碰撞性已经被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它也已经不安全了。)

目前认为安全的密码学哈希算法: SHA-2系列(包括SHA-256、SHA-384、SHA-512等)、SHA-3系列(包括SHA3-224、SHA3-256、SHA3-384、SHA3-512等)、SM3等等

主流的密码学哈希算法

目前国际上主流的密码学哈希算法是SHA-2与SHA-3,国内主推的则是国密标准的SM3。以SHA-256为例,256代表其散列值的长度是256位,即32个字节。一般来说,散列值长度越长,抗碰撞性就越好,所以SHA-512拥有比SHA-256更好的抗碰撞性。而在散列值长度相同时,SHA-3系列算法被认为比SHA-2系列拥有更高的安全强度,其碰撞概率更低。SM3的散列值长度固定为256位,在安全强度上与SHA-256相当。

SHA256散列算法(SHA2算法)

SHA256算法是SHA-2系列算法中应用最广泛的一个算法。

SHA-2是Secure Hash Algorithm 2(安全散列算法2)的缩写,它是一个密码学哈希算法集合,由美国国家安全局研发,由美国国家标准与技术研究院(NIST)在2001年发布,属于SHA算法之一,是SHA-1的后继者。SHA-2包含了6个具体的算法:

  • SHA-224
  • SHA-256
  • SHA-384
  • SHA-512
  • SHA-512/224
  • SHA-512/256

这些具体算法之间的区别主要是散列值的长度,迭代计算的次数不尽相同。它们的基本算法过程是一致的,以最常用的SHA256算法为例进行说明。

SHA256算法过程

在这里插入图片描述
该过程说明如下:

  1. 对明文进行补位处理,使明文长度为512的整数倍.
  2. 将补位后的明文拆分为n个512位的块。
  3. 对n个块进行迭代,依次对每个块做SHA256压缩运算,最终得到8个散列字(一个字4个字节)。
  4. 将最终的8个散列字拼接起来,得到最终的散列值,共32个字节,256位。

SM3散列算法

SM3是我国国家标准的商用密码体系中提供的一种密码学哈希算法,首版由国家密码管理局于2010年12月17日发布。目前最新版本为2016年发布的GB/T 32905-2016 信息安全技术 SM3密码杂凑算法。

SM3算法过程与SHA256基本相同,只是核心的压缩函数的具体实现逻辑不同。

在这里插入图片描述
该过程说明如下:

  1. 对明文进行补位处理,使明文长度为512的整数倍。
  2. 将补位后的明文拆分为n个512位的块。
  3. 对n个块进行迭代,依次对每个块做SM3压缩运算,最终得到8个散列字(一个字4个字节)。
  4. 将最终的8个散列字拼接起来,得到最终的散列值,共32个字节,256位。

应该使用哪种单向散列函数呢

  1. 首先,MD5 是不安全的,因此不应该使用。
  2. SHA-1 除了用于对过去生成的散列值进行校验之外,不应该被用于新的用途,而是应该迁
    移到 SHA-2。
  3. SHA-2 有效应对了针对 SHA-1 的攻击方法,因此是安全的,可以使用。
  4. SHA-3 是安全的,可以使用。
  5. 2013 年发布的《CRYPTREC 密码清单》中,SHA-2 ( SHA-256、 SHA-384、SHA-512 )被
    列入了 “电子政府推荐使用的密码清单” 中。

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

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

相关文章

【920信号与系统笔记】第二章 连续时间系统的时域分析

连续时间系统的时域分析 2.1引言综述n阶线性系统1.数学模型2.解法古典解法近代时域法(卷积法、算子法) 叠加积分法1.本质2. 待解决问题 2.2系统方程的算子表示法算子及其运算规则1.微分算子和积分算子2.运算规则3.电容和电感的伏安特性 转移算子1.定义2.…

20230508MTCNN1

多目标检测思路 单目标检测:图片 输入到 模型,模型输出 4个值 为什么模型只能检测单个目标? 因为模型 固定输出4个值,表示 一个目标 如何实现多目标检测?思路:一个一个地数 模型要能够 认识目标&#xff…

LiangGaRy-学习笔记-Day12

1、作业回顾 1.1、判断磁盘利用率 要求: 判断磁盘的使用率,如果超过了90%就警告 [rootNode1 sh]# vim disk_check.sh #!/bin/bash #Author By LiangGaRy #2023年5月9日 #Usage:检测硬盘的使用率 ########################################### #定义一…

蓝奥声核心技术分享——用电插座的安全保护技术(安全计量插座)

1.技术背景 用电插座的安全保护技术主要针对在用电负载接入接出(即插拔)用电插座的过程,解决瞬态异常监控及安全保护问题。该项技术涉及物联网智能硬件设备与测控技术领域,尤其涉及电能信号监测与用电安全监控的技术领域。 随着…

【Redis高级应用】分布式缓存

文章目录 单机Redis存在的问题Redis持久化RDB持久化执行时机RDB原理 AOF持久化AOF原理AOF配置AOF文件重写 RDB与AOF对比 Redis主从搭建主从架构主从数据同步原理全量同步增量同步repl_backlog原理 主从同步优化小结 Redis哨兵哨兵原理集群结构和作用集群监控原理集群故障恢复原…

MySQL多列字段去重的案例实践

同事提了个需求,如下测试表,有code、cdate和ctotal三列, select * from tt;现在要得到code的唯一值,但同时带着cdate和ctotal两个字段。 提起"唯一值",想到的就是distinct。distinct关键字可以过滤多余的重…

Machine Learning-Ex8(吴恩达课后习题)Anomaly Detection and Recommender Systems

1. Anomaly detection 内容:使用高斯模型来检测数据集中异常的数据(概率低的),先在2维数据中进行实验。样本具有两个特征:a. 服务器响应的吞吐量(mb/s) b. 延迟(ms)。 …

【linux网络】正则表达式

一、正则表达式 1.1作用范围 通常用于判断语句中,用来检查某一个字符串是否满足某一格式 1.2正则表达式的组成 普通字符包括大小写字母、数字、标点符号及其它符号元字符元字符是指在正则表达式中具有特殊意思的专用字符,可以用来规定其导字符&#…

【P18】JMeter JSON JMESPath Extractor

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜: http://111.231.103.117/#/login 进入网页后,登录,页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12,打开调试工具,点击搜索 二、测试计划设…

Bean的存取、五大注解、对象的注入方式、Bean的作用域和生命周期

一、Bean 的创建、存储和使用 PS:Java语言中的对象也叫作 Bean。 1、创建一个maven项目 PS:要在 pom.xml 中添加 spring 框架支持 PS:引入 lombok 依赖(可以帮助实现 get 和 set 方法) 2、存对象 2.1、创建类 启…

Linux 蜂鸣器驱动实验

蜂鸣器驱动原理 ①、在设备树中添加 SNVS_TAMPER1 引脚的 pinctrl 信息。 ②、在设备树中创建蜂鸣器节点,在蜂鸣器节点中加入 GPIO 信息。 1、修改设备树文件 添加 pinctrl 节点 I.MX6U-ALPHA开发板上的BEEP使用了SNVS_TAMPER1这个PIN,打开imx6ull-alien…

【01】C++的第一个程序Hello World

C的第一个应用程序(Hello World程序) 引言一、代码二、代码解释三、注意事项总结 引言 💡 作者简介:专注于C/C高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。 👉 &#x1f39…

报表生成工具Stimulsoft Reports.JS如何减少产品脚本的加载时间

Stimulsoft Reports 是一款报告编写器,主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署,如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等,在你的应用程序中嵌入报告设计器…

Django框架之视图HttpResponse 对象

本篇文章主要内容为:视图中HttpResponse对象的属性、方法及json、redirect子类包含使用cookie使用、跳转、json返回的示例。 概述 HttpResponse对象是对用户访问的响应,与HttpRequest对象由django创建,HttpResponse对象是由开发人员创建。Ht…

001+limou+MySQL的基础命令

0.前言 您好,这里是limou3434的一篇个人博文,感兴趣的话您也可以看看我的其他文章。本博文是借鉴于李小威前辈所著的书籍《SQL 基础教程》所成的博文笔记,这本书真的很适合新手学习数据库相关的内容。本次我想给您带来的是关于MySQL的一些基…

网站神奇工具Viewport Resizer,支持手机、pad和电脑等不同尺寸大小

标题:Viewport Resizer:让网站适应不同设备的神奇工具! 导语: 在互联网世界中,我们常常需要在不同设备上浏览网站。为了让用户在手机、平板或电脑上都能看到美观易用的页面,网站开发者们努力优化网站的适应…

qemu-虚拟机

qemu 官网下载地址 https://www.qemu.org/ 跨平台虚拟机,类型vmware,执行效率比vmware高 官方参考文档:https://www.qemu.org/docs/master/system/introduction.html kvm,轻量级虚拟机,可以加速qemu的执行 qemu-e…

微信云开发技术架构

(仅有把抱怨环境的情绪,化为上进的力量,才是成功的保证。——罗曼罗兰) 微信云开发 官方文档 文本只用来概述微信云开发的技术架构,并结合实战场景进行说明。更详细的请直接查看微信官方文档。 背景 微信云开发是微…

Oracle11g全新讲解之游标

游标 游标的作用:处理多行数据,类似与java中的集合 1.隐式游标 一般是配合显示游标去使用的,不需要显示声明,打开,关闭,系统自定维护,名称为:sql 常用属性: sql%found:语句影响了…

快速分隔文件(split),合并文件(paste)的命令;eval(先扫描输出在执行)命令

split快速分割文件,paste快速合并文件;eval命令 split命令快速分隔文件paste命令快速合并文件eval命令 split命令快速分隔文件 语法格式: split 【选项】 参数 原始文件 拆分后文件名前缀 常用选项 -l:以行数拆分 -b&#xf…