【常见开源库的二次开发】基于openssl的加密与解密——单向散列函数(四)

目录:

目录:

一、什么是单项散列函数?

1.1 如何验证文件是否被修改过

 1.2 单项散列函数:

二、单向hash抗碰撞

        2.1 弱抗碰撞(Weak Collision Resistance)

        2.2 强抗碰撞(Strong Collision Resistance)

        2.3 安全性问题

        2.4 当前推荐使用的哈希函数

三、单向hash应用场景

3.1  文件完整性(检查下载的软件是否被篡改):

3.2 口令加密:

3.3 消息认证(确保消息未被篡改):

3.4 伪随机数生成器(PRNG):

3.5 数字签名和非对称加密:

3.6 比特币的工作量证明(Proof of Work, PoW):

 四、常用hash算法

4.1 MD5:

4.2 SHA1:

4.3 SHA2:

4.4 SHA-256:

4.5 SHA3:


一、什么是单项散列函数?

1.1 如何验证文件是否被修改过

文件首次创建或被认为是处于可信状态时,这个已存储的文件在传输文件过程中由于安全性原因可能会中途被攻击者篡改信息,当我们拿到文件后如何知道信息是否被篡改保证信息的安全性呢?

这里我们首先将已存储的文件先做一个已存储文件副本,当我们已存储文件传输到我们这里时,我们想要知道信息是否完整,我们可以通过与之前的已存储文件副本进行比对校验确认完整性

已存储文件在形成已存储文件副本和传输文件时,我们可以认为这个过程的安全性都是相同的,都是有可能篡改的,而且在形成与校验过程中开销相对来说也是比较大的

指纹代替文件比对将已存储文件形成一个指纹文件,指纹文件比较小,对于指纹文件的安全管理相对变得容易,而且开销也相对文件来说会小很对

我们可以用一台可信服务器来放我们的安全属性,这样安全保存的成本更低,获取指纹的开销也比较小。

 

这里指纹需要满足的特点:计算开销小、存储空间开销小、已存储文件改变之后指纹文件跟着改变

 1.2 单项散列函数:

根据指纹所需要满足的特点,解决这样的问题,我们就用到的单项散列函数

单项散列函数也称为哈希函数是一种从输入数据(通常称为“消息”)生成固定大小输出(通常称为“哈希值”或“哈希码”)的算法。单向散列函数的关键特性之一是它们的单向性和抗碰撞性,这意味着从哈希值反推原始数据是非常困难的,并且找到两个不同的输入数据,使其产生相同的哈希值也非常困难。

(1)任意长度数据 => 固定长度散列:无论输入数据的大小或长度如何,哈希函数都会输出一个固定长度的哈希值。这使得哈希函数非常适用于处理大型数据集

(2)减少匹配开销通过比较两个哈希值,而不是两个完整的数据集,可以大大减少匹配开销。这在比如文件完整性检查、数据库索引创建等场景中非常有用。

(3)快速计算:哈希函数通常设计得非常高效,可以快速计算出输入数据的哈希值。

(4)快速验证:由于哈希值的固定大小,验证哈希值比验证原始数据更快更简单。

(5)消息变化=>散列值变化:哈希函数的另一个关键特性是,即使输入数据的微小变化也会导致哈希值的大幅度变化。这就意味着,如果文件或消息被修改,哈希值也会改变,从而可以通过比较哈希值来检测修改。

(6)验证修改:通过对比文件或消息的原始哈希值和新的哈希值,可以验证它们是否被修改过。

(7)单向不可逆:从哈希值无法(或至少在计算上不可行)反推出原始输入数据,这是哈希函数的关键安全特性之一。

(8)抗碰撞:找到两个不同的输入,它们产生相同的哈希值是非常困难的。这称为哈希函数的抗碰撞性。这是哈希函数在众多用途,如密码学、数据完整性校验等方面的关键属性。

二、单向hash抗碰撞

2.1 弱抗碰撞(Weak Collision Resistance)

弱抗碰撞是指对于一个给定的输入 𝑥,很难找到另一个不同的输入 x′,使得 𝑥≠𝑥′ 且 ℎ(𝑥)=ℎ(𝑥′)。换句话说,给定一个特定的哈希值,很难找到另一个不同的输入,使得它们的哈希值相同

2.2 强抗碰撞(Strong Collision Resistance)

强抗碰撞是指很难找到任意两个不同的输入 𝑥和 𝑥′,使得 𝑥≠𝑥′且 ℎ(𝑥)=ℎ(𝑥′)。换句话说,找到任何两个具有相同哈希值的不同输入是非常困难的。

2.3 安全性问题

  • MD5:MD5是一种广泛使用的哈希函数,但由于其设计上的缺陷,已经证明不再具有强抗碰撞性。这意味着可以找到两个不同的输入,它们具有相同的MD5哈希值。因此,MD5不再被推荐用于需要高安全性的应用,如数字签名。

  • SHA-1:SHA-1也是一种曾经广泛使用的哈希函数。然而,由于密码学分析的进展,SHA-1的强抗碰撞性也被攻破。虽然找到实际的碰撞需要大量的计算资源,但这已经表明SHA-1不再安全。因此,SHA-1也不再被推荐用于需要高安全性的应用。

2.4 当前推荐使用的哈希函数

为了确保安全性,推荐使用更现代的哈希函数,如SHA-256、SHA-3等。这些哈希函数目前被认为是安全的,具有良好的抗碰撞性。

三、单向hash应用场景

3.1  文件完整性(检查下载的软件是否被篡改):

通过比如 MD5, SHA1 或 SHA256 等散列算法来验证文件的完整性。下载文件时通常会提供一个哈希值,用户可以通过计算下载文件的哈希值并与提供的哈希值进行比较来确保文件未被篡改

3.2 口令加密:

口令应通过哈希函数进行存储,而非明文。为增加安全性,常与加盐技术(salt)结合使用,这样即使两个相同的密码,由于加盐不同,其最终的哈希值也会不同。常用的哈希算法包括 bcrypt, PBKDF2 或 Argon2。

3.3 消息认证(确保消息未被篡改):

HMAC(Hash-based Message Authentication Code)是一种基于密钥的哈希算法,用于验证消息的完整性和真实性。它结合了哈希函数和一个密钥,只有知道密钥的人才能验证哈希值,从而确保消息的安全。

3.4 伪随机数生成器(PRNG):

在密码学中,高质量的伪随机数对于生成安全的密钥和密码非常重要。PRNG应具备高熵(随机性)以确保产生的数值不可预测。

3.5 数字签名和非对称加密:

通过使用非对称加密技术,可以生成数字签名来验证一个消息或文件的真实性和完整性。发送者使用私钥签名,接收者则可以用相应的公钥来验证签名。

3.6 比特币的工作量证明(Proof of Work, PoW):

这是一种共识机制,用于在没有中央权威的情况下达成网络共识。它要求参与者解决一个计算密集型的问题,解决问题的过程需要大量的计算资源,这样可以防止恶意攻击和垃圾交易。

 四、常用hash算法

4.1 MD5

MD5(Message-Digest Algorithm 5)已经不再被视为安全的哈希函数,因为它的碰撞抵抗性较弱,即存在两个不同的输入可能产生相同的输出的情况。然而,它仍然广泛用于非加密目的的数据完整性检查。

4.2 SHA1

安全哈希算法1(SHA-1)比MD5更安全,但是同样因为碰撞抵抗性较弱而不再建议用于密码学哈希。

4.3 SHA2

SHA-2是一组哈希函数,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224和SHA-512/256等。SHA-256、SHA-384和SHA-512分别输出256位、384位和512位长的哈希值,被广泛应用在安全协议和系统中。

4.4 SHA-256

SHA-256是应用最广泛的SHA-2函数,比特币的工作量证明(PoW)就是采用的SHA-256哈希函数。

4.5 SHA3

SHA-3(Keccak)是SHA-2的后续版本,采用全新的设计。Keccak256(256位长的SHA-3版本)用于以太坊中生成地址和交易哈希

4.6 国密SM3

SM3是中国国家密码管理局推出的密码哈希函数标准,输出256位长的哈希值,主要应用在中国的安全系统和产品中。

尽管哈希函数的输出看起来是随机的,但它们都是确定性的:同一输入总是产生相同的输出。而安全的哈希函数还应具有以下性质:碰撞抵抗(难以找到两个不同输入产生相同输出)、预图像抵抗(给定哈希值难以找到对应的输入)和次预图像抵抗(给定输入难以找到另一输入产生相同的输出)。

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

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

相关文章

图像边缘检测中Sobel算子的原理,并附OpenCV和Matlab的示例代码

Sobel算子是一种用于图像边缘检测的离散微分算子。它结合了图像的平滑处理和微分计算,旨在强调图像中强度变化显著的区域,即边缘。Sobel算子在图像处理中被广泛使用,特别是在计算机视觉和图像分析领域。 Sobel算子的原理 Sobel算子主要用于计…

IMemoryCache 使用

IMemoryCache 提供了一个内存中的缓存存储&#xff0c;允许你存储和检索对象&#xff0c;这些对象可以在应用程序的不同部分之间共享&#xff0c;以提高性能并减少重复计算或数据库访问的次数。 public interface ICacheService : IDisposable{/// <summary>/// 验证缓存…

大模型入门(一)—— LLaMa/Alpaca/Vicuna

LLaMa模型是Meta开源的大模型&#xff0c;模型参数从7B到65B不等&#xff0c;LLaMa-7B在大多数基准测试上超过了GPT3-173B&#xff0c;而LLaMa-65B和Chinchilla-70B、PaLM-540B相比也极具竞争力。相比于ChatGPT或者GPT4来说&#xff0c;LLaMa可能效果上还有差距&#xff0c;但相…

oracle显示列名,列注释

项目场景&#xff1a; 数据库文档中&#xff0c;需要&#xff08;列名&#xff0c;列注释&#xff09;两列 问题描述 数据库文档中&#xff0c;需要&#xff08;列名&#xff0c;列注释&#xff09;两列&#xff0c;而且不止一张表&#xff0c;是很多张&#xff0c;这个时候…

HyperBDR云容灾,让低碳未来有“迹”可循

全球气候变化时刻牵动着我们的心。生活在同一个地球下&#xff0c;万博智云始终坚持环境友好&#xff0c;携手企业和合作伙伴在保持市场竞争力、促进企业可持续发展的同时&#xff0c;共同肩负起守护地球环境的责任。 HyperBDR云容灾以“碳足迹”践行低碳容灾 云产品及数据中心…

Qt界面假死原因

创建一个播放器类&#xff0c;继承QLabel&#xff0c;在播放器类中起一个线程用ffmpeg取流解码&#xff0c;将解码后的图像保存到队列&#xff0c;在gui线程中调用update()刷新显示。 当ffmpeg打开视频流失败后调用update()将qlabel刷新为黑色&#xff0c;有一定概率会使得qla…

随机采样一致性算法RANSAC

点云分割 图自&#xff1a;https://openaccess.thecvf.com/content_cvpr_2017/papers/Qi_PointNet_Deep_Learning_CVPR_2017_paper.pdf《PointNet:用于3D分类和分割的点集深度学习》 点云分割(Point Cloud Segmentation)是计算机视觉和3D图像处理中的一个重要步骤&#xff0c;…

数据结构——位图布隆过滤器

一、位图 1.1 概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数据&#xff0c;数据无重复的场景。通常是用来判断某个数据存不存在的。 数据是否在给定的整形数据中&#xff0c;结果是在或者不在&#xff0c;刚好是两种状态&#xff0c;那么可以…

Android获取当前屏幕显示的是哪个activity

在 Android 中&#xff0c;要获取当前屏幕显示的 Activity&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;使用 ActivityManager 获取当前运行的任务信息 这是一个常见的方法&#xff0c;尽管从 Android 5.0 (API 21) 开始&#xff0c;有些方法变得不太可靠…

【多线程】线程安全的单例模式

文章目录 什么是单例模式饿汉实现方式饿汉实现模式的特点 懒汉实现方式懒汉实现方式的特点 什么是单例模式 单例模式是一个设计模式&#xff0c;其目的是确保一个类只有一个实例&#xff0c;并提供一个全局的访问点来访问该实例。单例模式常用于需要控制资源数量的场景&#x…

C++:类的定义和实例化

目录 一、类的定义 1、类的定义格式 2、访问限定符 3、类域 二、实例化 1、实例化的概念 2、对象大小 一、类的定义 1、类的定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。类体中内容…

@TableName(value=““)

Spring中Service对应的实体Entity类上不写TableName(value"")的注解&#xff0c;怎样对应到数据表&#xff1f; 在使用 MyBatis-Plus 时&#xff0c;如果实体类没有使用 TableName(value"") 注解来指定数据库表名&#xff0c;MyBatis-Plus 会根据默认的命…

log4js node日志插件

最近不是特别忙在用express搭建后台项目&#xff0c;在开发过程中遇到了需要输入日志的问 本来想直接用node自带的console来实现&#xff0c;后来发现console输出的日志达不到自己希望的 日志格式&#xff0c;后来各种百度发现了log4js插件&#xff0c;本文来记录log4js插件使用…

STM32智能工业自动化监控系统教程

目录 引言环境准备智能工业自动化监控系统基础代码实现&#xff1a;实现智能工业自动化监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业自动化与管理问题解决方案与优化收尾与总结 1. 引言 智能…

基于zynq的视频采集与hdmi显示(未完)

文章目录 一、项目整体框架一、传感器配置与驱动二、IMX222 1080P 模式图像解析(bayer 2 rgb 模块)2.1 解析有效像素(gen_sync)2.1.1同步字详细介绍&#xff1a; 2.2 bayer 2 rgb 一、项目整体框架 一、传感器配置与驱动 camera信息&#xff1a;索尼IMX222摄像头 SPI&#xf…

脚本练习-每5分钟执行一次获取当前服务器的基本情况

设计一个shell程序&#xff0c;每5分钟执行一次获取当前服务器的基本情况&#xff08;内存使用率&#xff0c;CPU负载&#xff0c;I/O&#xff0c;磁盘使用率&#xff09;&#xff0c;保存到120.20.20.20数据库上数据库帐号aaa密码bbb库名test表名host 创建一个名为server_stat…

Android10.0 锁屏分析-KeyguardPatternView图案锁分析

首先一起看看下面这张图&#xff1a; 通过前面锁屏加载流程可以知道在KeyguardSecurityContainer中使用getSecurityView()根据不同的securityMode inflate出来&#xff0c;并添加到界面上的。 我们知道&#xff0c;Pattern锁所使用的layout是 R.layout.keyguard_pattern_view&a…

【内网穿透】如何本地搭建Whisper语音识别模型并配置公网地址

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

用C语言写的一个扫雷小游戏

头文件 调用头文件和声明函数 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <time.h> #include <stdlib.h>#define ROW 9 #define COL 9#define ROWS ROW2 #define COLS COL2#define EASY_CONT 10//声明函数 //初始化棋盘函数 void InitB…

【机器学习】Grid Search: 一种系统性的超参数优化方法

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Grid Search: 一种系统性的超参数优化方法引言什么是Grid Search&#xff1f;Gr…