五、单向散列函数

2023-10-26

  • 单向散列函数 — 获取消息的指纹
  • 当需要比较两条消息是否一致时,我们不必直接对比消息本身的内容,只要对比它们的“指纹”就可以了。
  • 单向散列函数(one-wayftnction)有一个输人和一个输出,其中输人称为消息(message),输出称为散列值(hashvalue)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。
  • 这里的消息不一定是人类能够读懂的文字,也可以是图像文件或者声音文件。单向散列函数不需要知道消息实际代表的含义。无论任何消息,单向散列函数都会将它作为单纯的比特序列来处理,即根据比特序列计算出散列值。
  • 散列值的长度和消息的长度无关。无论消息是1比特,还是100MB,甚至是1OOGB,单向散列函数都会计算出固定长度的散列值。以SHA-I单向散列函数为例,它所计算出的散列值的长度永远是160比特(20字节)。
  • 单向散列函数也称为消息摘要函数(message digest function)、哈希函数或者杂凑函数
  • 输人单向散列函数的消息也称为原像(pre-image)。
  • 单向散列函数输出的散列值也称为消息摘要(message digest)或者指纹(fingerprint)。

1.单向散列函数的性质

  • 通过使用单向散列函数,即便是确认几百MB大小的文件的完整性,也只要对比很短的散列值就可以了。
  • 根据任意长度的消息计算出固定长度的散列值
    • 首先,单向散列函数的输人必须能够是任意长度的消息。
    • 其次,无论输人多长的消息,单向散列函数必须都能够生成长度很短的散列值,如果消息越长生成的散列值也越长的话就不好用了。从使用方便的角度来看,散列值的长度最好是短且固定的。
  • 能够快速计算出散列值
    • 计算散列值所花费的时间必须要短。尽管消息越长,计算散列值的时间也会越长,但如果不能在现实的时间内完成计算就没有意义了。
  • 消息不同散列值也不同
    • 为了能够确认完整性,消息中哪怕只有1比特的改变,也必须有很高的概率产生不同的散列值。
    • 如果单向散列函数计算出的散列值没有发生变化,那么消息很容易就会被篡改,这个单向散列函数也就无法被用于完整性的检查。两个不同的消息产生同一个散列值的情况称为碰撞(collision)
    • 难以发现碰撞的性质称为抗碰撞性(collisionresistance)。密码技术中所使用的单向散列函数,都需要具备抗碰撞性。
  • 具备单向性
    • 单向性指的是无法通过散列值反算出消息的性质。根据消息计算散列值可以很容易,但这条单行路是无法反过来走的。
    • 尽管单向散列函数所产生的散列值是和原来的消息完全不同的比特序列,但是单向散列函数并不是一种加密,因此无法通过解密将散列值还原为原来的消息

2.单向散列函数的实际应用

2.1 检测软件是否被篡改
  • 很多软件,尤其是安全相关的软件都会把通过单向散列函数计算出的散列值公布在自己的官方网站上。用户在下载到软件之后,可以自行计算散列值,然后与官方网站上公布的散列值进行对比。通过散列值,用户可以确认自己所下载到的文件与软件作者所提供的文件是否一致。
2.2 消息认证码
  • 消息认证码是将“发送者和接收者之间的共享密钥”和“消息”,进行混合后计算出的散列值。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装。
2.3 数字签名
  • 数字签名是现实社会中的签名(sign)和盖章这样的行为在数字世界中的实现。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接施加数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名。
2.4 伪随机数生成器
  • 密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。
2.5 一次性口令
  • 一次性口令经常被用于服务器对客户端的合法性认证。在这种方式中,通过使用单向散列函数可以保证口令只在通信链路上传送一次(one-time),因此即使窃听者窃取了口令,也无法使用。

3.常用的单向散列函数

3.1 MD4、MD5
  • MD4是由Rivest于1990年设计的单向散列函数,能够产生128比特的散列值(RFC1186,修订版RFC1320)。不过,随着Dobbertin提出寻找MD4散列碰撞的方法,因此现在它已经不安全了。
  • MD5是由Rwest于1991年设计的单项散列函数,能够产生128比特的散列值(RFC1321)。
  • MD5的强抗碰撞性已经被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它也已经不安全了。
  • MD4和MD5中的MD是消息摘要(Message Digest)的缩写。
3.2 Go中使用MD5
package main

import (
	"crypto/md5"
	"fmt"
	"encoding/hex"
)

//计算Md5的方式1
func getMD5_1(str []byte) string {
	// 1. 计算数据的md5
	result := md5.Sum(str)
	fmt.Println(result)
	fmt.Printf("%x\n", result)
	// 2. 数据格式化为16进制格式字符串
	res := fmt.Sprintf("%x", result)
	fmt.Println(res)
	// --- 这是另外一种格式化切片的方式
	res = hex.EncodeToString(result[:])
	fmt.Println("res: ", res)
	return res
}

//计算Md5的方式2
func getMD5_2(str []byte) string {
	// 1. 创建一个使用MD5校验的Hash对象`
	myHash := md5.New()
	// 2. 通过io操作将数据写入hash对象中
	//io.WriteString(myHash, string(str))
	myHash.Write(str)
	// 3. 计算结果
	result := myHash.Sum(nil)
	fmt.Println(result)
	// 4. 将结果转换为16进制格式字符串
	res := fmt.Sprintf("%x", result)
	fmt.Println(res)
	// --- 这是另外一种格式化切片的方式
	res = hex.EncodeToString(result)
	fmt.Println(res)

	return res
}

func main() {
	str := "事后诸葛亮"
	getMD5_1([]byte(str))
	fmt.Println("--------------------------")
	getMD5_2([]byte(str))
}
  • 输出结果:
[69 31 184 192 42 4 128 175 88 70 8 56 1 140 151 62]
451fb8c02a0480af58460838018c973e
451fb8c02a0480af58460838018c973e
res:  451fb8c02a0480af58460838018c973e
--------------------------
[69 31 184 192 42 4 128 175 88 70 8 56 1 140 151 62]
451fb8c02a0480af58460838018c973e
451fb8c02a0480af58460838018c973e
3.3 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512
  • SHA-1是由NIST(NationalInstituteOfStandardsandTechnology,美国国家标准技术研究所)设计的一种能够产生160比特的散列值的单向散列函数。1993年被作为美国联邦信息处理标准规格(FIPS PUB 180)发布的是SHA,1995年发布的修订版FIPS PUB 180-1称为SHA-1。
  • SHA-1的消息长度存在上限,但这个值接近于264比特,是个非常巨大的数值,因此在实际应用中没有问题。
  • SHA-224、SHA-256、SHA-384和SHA-512都是由NIST设计的单向散列函数,它们的散列值长度分别为224比特、256比特、384比特和512比特。这些单向散列函数合起来统称SHA-2,它们的消息长度也存在上限(SHA-224 和 SHA-256的上限接近于 264 比特,SHA-384 和 SHA-512的上限接近于 2128 比特)。SHA-1 的强抗碰撞性已于2005年被攻破, 也就是说,现在已经能够产生具备相同散列值的两条不同的消息。不过,SHA-2还尚未被攻破。
hash函数 比特数 字节数
MD4 128bit 16byte
MD5 128bit 16byte
SHA-1 160bit 20byte
SHA-224 224bit 28byte
SHA-256 256bit 32byte
SHA-384 384bit 48byte
SHA-512 512bit 64byte
3.4 Go中对SHA-1、SHA-2的使用
package main

import (
	"crypto/sha1"
	"encoding/hex"
	"crypto/sha256"
	"crypto/sha512"
	"fmt"
)

func Sha(typ int, str []byte) string {
	myHash := sha1.New()
	if typ == 256 {
		myHash = sha256.New()
	}
	if typ == 512 {
		myHash = sha512.New()
	}

	myHash.Write(str)
	tmp1 := myHash.Sum(nil)
	result := hex.EncodeToString(tmp1)
	return result
}

func main() {
	b := []byte("事后诸葛亮")
	fmt.Println("sha1: ", Sha(0, b))
	fmt.Println("sha256: ", Sha(256, b))
	fmt.Println("sha512: ", Sha(512, b))
}
  • 输出结果
sha1:  542ddfd33bbfbcb0e3627bf9f50116c1593e7d41
sha256:  920453953d64d84a199b38591a89b65f630acbdd7efe9adf34f5603185bc72a3
sha512:  af654c7a047ab41bad6f17cb77f3a4cb770017ada7634f04c7444a512172bf53587716677e0c9247189fc2e4b7193784e919c52283cebdb2f7dcf22c055ed8c9
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

五、单向散列函数 的相关文章

  • 密码编码学与网络安全(2):对称密码之传统加密技术

    对称密码之传统加密技术 关于对称加密 对称密码模型 密码编码学 密码分析学与穷举攻击 古典加密算法 代替技术 置换技术 转轮机 隐写术 关于对称加密 对称加密 也称为传统加密或单密钥加密 是20世纪70年代公钥密码产生之前唯一的 加密类型
  • CTF入门学习笔记——Crypto密码(编码)

    文章目录 CTF入门学习笔记 Crypto密码 编码 BASE编码 BASE16 BASE32 BASE64 BASE85 AFCTF 2018 BASE Uuencode编码 SWPUCTF 2021 新生赛 crypto8 Rabbit
  • 密码学之公钥密码体系(2):RSA算法

    密码学之公钥密码体系 2 RSA算法 文章目录 一 RSA算法背景 二 RSA算法描述 三 RSA的硬件实现 四 RSA的安全性 五 对RSA的选择密文攻击 一 RSA算法背景 上一讲介绍了公钥密码体系中的背包算法 在Merkle背包算法出
  • RSA简介

    什么是RSA RSA算法是应用最广泛的公钥密码算法 1977年 RSA算法由MIT的罗纳德 李维斯特 Ron Rivest 阿迪 萨莫尔 Adi Shamir 和伦纳德 阿德曼 Leonard Adleman 共同设计 于1978年正式发布
  • 【区块链与密码学】第6-9讲:数字签名算法的可证明安全性

    本课堂内容全部选编自PlatON首席密码学家 武汉大学国家网络安全学院教授 博士生导师何德彪教授的 区块链与密码学 授课讲义 教材及互联网 版权归属其原作者所有 如有侵权请立即与我们联系 我们将及时处理 6 9数字签名算法的可证明安全性 可
  • 区块链密码学学习笔记

    一 哈希算法 哈希函数是将任意长度的二进制明文通过算法处理映射为较短且固定长度的 二进制值 映射后的值也被称为哈希值 哈希值的数据唯一 且形式紧凑 即使只是变更明文中的一个字母 最终得到的哈希值也会发生变更 由于哈希算法本身的特点 任何人都
  • js逆向--百度滑块验证码

    声明 本文章中所有内容仅供学习交流 不可用于任何商业用途和非法用途 否则后果自负 如有侵权 请联系作者立即删除 由于本人水平有限 如有理解或者描述不准确的地方 还望各位大佬指教 在工作中遇到了百度的滑块 翻了下csdn以及公众号发现没人写
  • 传统加密技术总结

    密码编码学与网络安全讨论两大领域 密码算法和协议 又可以分为4个主要的领域 对称加密 Symmetric encryption 用于加密任意大小的数据块或数据流的内容 消息 文件 加密密钥和口令 非对称加密 Asymmetric encry
  • openssl hmac源码分析

    hmac 原理 HMAC 用于保护消息的完整性 它采用摘要算法对消息 填充以及秘密密钥进行混合 运算 在消息传输时 用户不仅传送消息本身 还传送 HMAC 值 接收方接收数据后也进 行 HMAC 运算 再比对 MAC 值是否一致 由于秘密密
  • 忘记文档密码,教你破解WORD/EXECL/PPT文件加密密码

    大家办公时 有设置密码习惯 并且容易忘记密码 今天给大家提供一款超好用得小工具 不定时更新软件 高效率工具小福利 软件 Advanced OfficePassword Recovery 今天给大家带来一款破解Excel密码的神器 涉及到重要
  • 密码学-hash加密

    以下代码分别为乘法hash sha256 md5 ripemd160的使用方法 package main import fmt crypto sha256 os io crypto md5 encoding hex golang org x
  • DSA算法

    DSA 本文主要叙述在CTF中的DSA 根据我自己的理解重述一遍CTF wiki对DSA的描述 公私钥的生成 选择一个哈希函数 H H H 一般选作SHA1 选择比特数为
  • 27、HMAC

    HMAC产生背景 HMAC为什么会被提出来 是MAC的产生有什么缺陷么 HMAC规范的设计是由于存在对将密钥与hash函数相结合的更简单机制的攻击 换言之就是有些将密钥和hash函数结合使用产生MAC的算法容易被攻击 而这种生成消息认证码的
  • 密码学研究重点

    密码学涵盖了认证 数字签名以及更多基本的安全功能 密码学涉及领域及其宽广 包括计算机安全 高等数学 经济学 量子物理学 民法和刑法 统计学 芯片设计 软件优化 政治 用户界面设计等 0x01 密码学重要性 密码学本身没有价值 必须作为一个系
  • 基础密码学知识和python pycrypto库的介绍使用

    一 密码学基础概念 1 密码 对文本进行编码 使偷窥者无法识别的算法 是一套编码方案 一种特殊的报文编码和相应的解码方式的结合体 加密之前的原始报文称为明文 使用密码之后的报文叫密文 一个简单的例子 这个例子是著名的三字符循环移位密码rot
  • 揭秘区块链的核心技术之「哈希与加密算法 」

    大家都知道 区块链的关键技术组成主要为 P2P网络协议 共识机制 密码学技术 账户与存储模型 而这些技术中 又以 密码学与共识机制 这两点为最核心 那么今天我们来详细的聊一聊密码学 看一看密码学技术是如何在区块链中应用的 首先 我们需知道区
  • 区块链密码学(一):密码学基础及概念

    一 概念 主要介绍非对称加密的一些概念 公钥 私钥 均可加密或解密 配对即可 一般来讲 私钥用来进行解密和签名 是给自己用的 公钥由本人公开 用于加密和验证签名 是给别人用的 签名 内容 gt hash gt digest gt 私钥加密
  • CTF入门学习笔记——Crypto密码(古典密码)

    文章目录 CTF入门学习笔记 Crypto密码 古典密码 凯撒密码 看我回旋踢 摩斯密码 摩斯 维吉尼亚密码 Vigen re 栅栏密码 篱笆墙的影子 栅栏密码 篱笆墙的影子 猪圈密码 待补充 CTF入门学习笔记 Crypto密码 古典密码
  • 密码学替代密码

    1 请指出一般替代密码的明文空间 密文空间和密钥空间各是什么 明文空间M和密文空间C都是26个英文字母的集合 密钥空间K Z 26 gt Z 26 是置换 是所有可能置换的集合 2 单表替代密码和多表替代密码的主要特点是什么 单表替代密码
  • 有趣的数学 为什么素数在密码学中很重要?

    这里我们将探讨为什么素数在密码学中很重要 我们将根据特定的密码系统 RSA 算法 来进行深入了解 一 素数的特殊性 每个数字都可以分解为它的素数 一般来说 找到一个数的因数是非常困难的 要找到一个自然数的所有素因数 必须尝试将其除以它的可能

随机推荐

  • python-图像边缘化处理

    本文由本人原创 仅作为自己的学习记录 主要利用Sobel 用作边缘检测 它是一离散性差分算子 用来运算图像亮度函数的灰度值 在图像的任何一点使用此算子 将会产生对应的灰度矢量或是其法矢量 Sobel边缘检测通常带有方向性 可以只检测竖直边缘
  • 【Linux0.11 源码历险记 2】《保护模式》

    继续跟着stup s 来看 lidt idt 48 load idt with 0 0 lgdt gdt 48 load gdt with whatever appropriate idt 48 word 0 idt limit 0 wor
  • 【Unity】 2D 游戏 库存模块实现

    库存模块主要参考了 youtube 上的视频 BMo 的 Flexible INVENTORY SYSTEM in Unity with Events and Scriptable Objects 和 Simple Inventory UI
  • DVWA SQL injection

    low 猜测表名 1 union select 1 group concat table name from information schema tables where table schema dvwa 如果出现问题 到MySQL里将
  • Java常用对象API——基本数据类型对象包装类

    基本数据类型对象包装类 为了方便操作基本数据类型值 将其封装成了对象 在对象中定义了属性和行为丰富了该数据的操作 用于描述该对象的类就称为基本数据类型对象包装类 byte Byte short Short int Integer long
  • EXCEL中数据透视表的(空白)如何不显示,并且不影响数据更新

    或许有碰到同样问题的 希望对大家有所帮助 1 数据透视表更新过来的数据显示 空白 不好看 开始将用户做了筛选 将空白的复选框去掉 可以达到效果 但是发现有数据更新时 新的数据不能被同步显示 除非手动去再次筛选用户将除空白外的数据勾选 2 点
  • Ble Mesh的Heatbeat(心跳)&地址&Model(模型)

    心跳 将节点配置为定期发送称为心跳消息的消息 Heartbeat 消息的目的 1 表示该节点仍然处于活动状态 2 允许根据传递 Heartbeat 消息所需的跳数确定其与接收者的距离 Heartbaeat的opcode 和Friend re
  • 主存储器的基本组成

    主存储器的基本组成 存储体 存储体也叫存储矩阵 是由一个个存储0或1的记忆单元 存储元 构成的 为了存取存储体中的信息 必须对存储单元进行编址 编址单位是指具有相同地址的那些存储元件构成的一个单位 常见有按字节编址 寻址访存 CPU首先把被
  • C#集合(泛型集合与非泛型)

    每日一句 自律 努力 方法 坚持 时间 优秀 集合特点 一种数据容器 一种数据结构 容纳多个数据 大小可变 空间不一定连续 命名空间 非泛型集合 System Collections 非泛型集合 System Collections Gen
  • 动态博客系统

    Halo 是我折腾过的众多博客系统里面 最好 最容易上手的动态博客系统之一 solo 也是 轻快 简洁 功能强大 正文 上周末正在募集团队一起写算法题 群里讨论需要一个网站来存放文章 恰巧我有一个已经备案但闲置的域名 马上开干 之前的网站是
  • 解惑React之this.setState({ [name]: value })

    react之this setState name value 疑问 学习React中文官方文档中的非空组件与受控组件中 遇到如下代码 class Reservation extends React Component constructor
  • 【面试系列】重排链表

    题意 原题链接 思路 快慢指针找到中点 或者先遍历得到长度 再遍历一半也可行 反转后半部分 归并两部分 代码 Definition for singly linked list struct ListNode int val ListNod
  • Excel 解析,通过Excel的地址和MultipartFile进行解析

    目录 两种方法都用到了read 和getValue 方法对数据进行解析 只是二者传入的Excel数据格式不一样 第一种方法 通过Excel地址进行解析Excel的数据 第二种方法 解析Excel的MultipartFile数据流获取数据 H
  • mmocr 训练字符检测模型

    目录 1 数据集 2 config文件配置 3 测试模型 1 数据集 这里以icdar2015字符检测为例https blog csdn net jizhidexiaoming article details 124149164 spm 1
  • Visio 2007/2010 左侧"形状"窗口管理

    Visio 2007 2010 左侧 形状 窗口管理 Visio 打开后 通常窗口左侧会有一个 形状 面板 我们可以方便地从中选择需要的形状 有时为了获得更大的版面空间或者不小心关闭了形状面板 怎么把它重新调出来 我们可以从 视图 中把它找
  • 使用docker快速搭建服务器环境

    思路 将nginx mysql tomcat等环境打包为一个个docker 然后使用docker compose管理 服务器内安装docker相关环境 然后直接运行docker compose配置 即可快速搭建完成服务器环境 之后可以将相关
  • Markdown / KaTex数学公式汇总

    目录 LaTex和KaTex 软件推荐 Mathpix 一 如何插入公式 二 上下标 三 常用运算符 四 高级运算符 五 常用数学符号 六 特殊符号 6 1 箭头 6 2 公式序号 七 括号使用 八 矩阵 九 集合运算 十 希腊字母 十一
  • 使用反射实现动态修改@Excel的注解属性

    业务场景 我们使用poi实现数据导出时 通常是根据 Excel name xxx 来确定列名 通常情况下这个是不会发生变动的 但这里就说少数情况 在我们需要这里根据某些情况来进行改变的时候 我们就需要用到反射 AirQualityRanki
  • Java反射(自己的理解)

    动态语言 运行是代码可以根据某些条件改变自身结构 像js和php python等 但是我们不像c 是一门静态语言 可以准确的说我们是一门准动态语言 因为反射让我们具有动态性 我来直接用我所理解的反射给大家先讲一下大概 这绝对让你的耳目一新
  • 五、单向散列函数

    单向散列函数 获取消息的指纹 当需要比较两条消息是否一致时 我们不必直接对比消息本身的内容 只要对比它们的 指纹 就可以了 单向散列函数 one wayftnction 有一个输人和一个输出 其中输人称为消息 message 输出称为散列值