【阿一网络安全】如何让你的密码更安全?(三) - 散列函数

散列函数

散列函数(Hash Function,又称散列算法、哈希函数),是一种从任何一种数据中创建小的数字指纹的方法。

散列值

散列函数,把任意长的消息明文,压缩成摘要,使得数据量变小,将数据的长度固定下来,这种输出的值,称为散列值或者哈希值(Hash Value)。

散列值,通常用一个短的随机字母和数字组成的字符串。

基本特性

不可逆性

这是散列函数的关键特点,从散列值无法从理论上还原出原始值,确保了数据安全。

抗碰撞性

一个好的散列算法,应该抵抗散列碰撞。

理论上,如果两个原始值是不相同的,那么他们的散列值也不相同。

但是也有概率会出现原始值不同散列值相同的情况,尤其是当输出长度有限时。

应用

数据加密

正因为散列函数拥有抗碰撞性和不可逆性,所以大多数的数据加密,可以使用散列算法。

数据完整性

通常把原数据和散列值一起发送,接收方接收到数据后,把原数据散列计算后得到的散列值和接收到的散列值比较,如果一致则证明该数据未被篡改。

散列表

散列表(Hash Table)是散列函数的一个主要应用,是一种非常高效的数据结构,主要用于存储和检索数据。

散列表通过将键(Key)映射到值(Value)来存储数据,每个键都通过特定的散列算法转为一个唯一的索引(Hash Code),然后每次查找指定的索引从而找到想要的值。

常用算法

MD5

MD5消息摘要算法(MD5 Message-Digest Algorithm),是一种广泛使用的密码散列函数,可以生成一个128位的散列值。

由MD2、MD3、MD4改进而来,主要增强算法复杂度和不可逆性。

但在1996年被证实存在弱点,可以被破解。

2004年被证实无法防止碰撞攻击,因此不适用于安全性,主要被用于SSL公开密钥认证或者数字签名等用途。

算法

MD5 是输入不定长数据,输出固定128位的算法。

一个MD5运算,由类似的64次循环构成,分成4组16次。

  • F:一个非线性函数;一个函数运算一次;
  • Mi:表示一个 32-bits 的输入数据;
  • Ki:表示一个 32-bits 常数,用来完成每次不同的计算。
应用场景
  • 文件校验,常用于文件下载时,生成文件的MD5值,与源文件的MD5值做比较,验证文件是否完整。
  • 消息摘要,由于计算速度较快,可以快速生成信息摘要的场景下使用。
示例

一般128位的MD5散列被表示为32位十六进制数字

import hashlibtext = "你好,阿一"
md5 = hashlib.md5()
md5.update(text.encode('utf-8'))
md5.hexdigest()# 362ccc2f2b1c6635d743a08990e5f908

SHA-1

SHA-1(Secure Hash Algorithm 1,安全散列算法 1),是一种密码散列函数。

SHA-1可以生成一个被称为消息摘要的160位散列值,散列值通常的呈现形式为40个十六进制数。

2005年,密码分析人员发现了对SHA-1的有效攻击方法,表明该算法可能不够安全。2017年2月23日,CWI Amsterdam与Google宣布了一个成功的SHA-1碰撞攻击,发布了两份内容不同但SHA-1散列值相同的PDF文件作为概念证明。

应用场景
  • 文件校验,校验文件是否完整,也可以校验文件的SHA-1值。
  • 数字证书,曾经被作为SSL/TLS协议的签名算法。
示例
sha1 = hashlib.sha1()
sha1.update(text.encode('utf-8'))
sha1.hexdigest()# 8e4a4706faba4f29685c28d062e99dc40a25d915

SHA-2

SHA-2(Secure Hash Algorithm 2,安全散列算法 2),2001年发布,是SHA-1的后继者,分为几个不同的算法标准,SHA-224,SHA-256,SHA-384,SHA-512,SHA-512/224,SHA-512/256。

最常用的是 SHA256,生成256位的散列值,64个十六进制表示。

算法

SHA-2的第t个加密循环。图中的深蓝色方块是事先定义好的非线性函数。

  • ABCDEFGH一开始分别是八个初始值,Kt是第t个密钥,Wt是本区块产生第t个word。
  • 原消息被切成固定长度的区块,对每一个区块,产生n个word(n视算法而定),透过重复运作循环n次对ABCDEFGH这八个工作区段循环加密。
  • 最后一次循环所产生的八段字符串合起来即是此区块对应到的散列字符串。
  • 若原消息包含数个区块,则最后还要将这些区块产生的散列字符串加以混合才能产生最后的散列字符串。
应用场景
  • 文件校验,校验文件是否完整,也可以校验文件的SHA-256值。
  • 数字证书,在数字证书和数字签名的生成过程中,SHA-256被广泛使用,提供较高的安全性和抵抗碰撞攻击的能力。
  • 密码保护,需要应用程序都是用SHA-256对密码进行散列计算存储,以提高密码安全。
示例

sha256 = hashlib.sha256()
sha256.update(text.encode('utf-8'))
sha256.hexdigest()# 4ce5cf90c0f604dfc94bfc80af7aaecd2247aae43ecacf5642ef321b7775f239

SM3

SM3是我国国家密码管理局发布的一种密码散列函数算法,属于国家商用密码,算法公开。

主要用于数据签名及验证、消息认证码生成及验证、随机数生成等,安全性及效率与SHA-256相当。

生成长度位为256位的散列值。

特点
  • 性能高效,计算速度非常高效,适合大规模数据处理。
  • 安全性,当前没有有效的攻击手段可以破坏SM3的安全性,其抗抵赖性和抗伪造能力都符合现代加密需求。
应用场景
  • 政府,信创环境
  • 国内的金融系统中的数据保护和数据完整性
  • 电子签名
  • 与SM2配套使用,用于SM2中数字签名的随机数生成
示例
from sm3utils import sm3
sm3 = sm3()
sm3.update(text.encode('utf-8'))
sm3.hexdigest()# 432d42b3fa85c117eaca85a0d7a8c6aceba7a52a66a101d624be0f456d0e604b

总结

本文主要简单介绍了密码散列函数算法 MD5、SHA-1、SHA-2、和 SM3 的基本原理,以及它们的实现过程。对比另外两类算法,散列函数算法最大优势就是验证完整性、散列表和数字签名。

三篇文章,对各种加密算法和应用场景进行了全面的介绍。密码学是一门深奥的学科,而作为密码学的使用者,只需要正确地理解各类算法的特性和功能,就可以满足日常的应用需求了。

总的来说,在使用的时候,要记住下面这些内容:

  • 对称加密具备较高的安全性和性能,要优先考虑;
  • 在一对多的场景中(如多人登录服务器),存在密钥分发难题的时候,我们要使用非对称加密;
  • 不需要可逆计算的时候(如存储密码),我们就使用散列函数算法。

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

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

相关文章

k8s 容忍和污点

文章目录 Taint作用在节点上,能够使节点排斥一类特定的Pod,也就是不能“兼容”该节点的污点的Pod。对应的Toleration作用在Pod上,意为容忍,也就是可以兼容某类污点。 给节点增加一个Taint也很简单,直接使用kubectl ta…

【PostgreSQL】安装及使用(Navicat/Arcgis),连接(C#)

简介 PostgreSQL 是一个功能强大的开源对象关系数据库系统 下载地址 PostgreSQL: Downloads 由于我电脑上安装的是arcgispro3.1所以需要下载对应的postgresql版本 PostgreSQL 12 对应的 PostGIS 版本主要是 3.5.0 或更高版本。 安装 一般设置为postgresql 安装扩展插件 此…

Centos如何配置阿里云的yum仓库作为yum源?

背景 Centos在国内访问官方yum源慢,可以用国内的yum源,本文以阿里云yum源为例说明。 快速命令 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.a…

《深度学习》OpenCV轮廓检测 模版匹配 解析及实现

目录 一、模型匹配 1、什么是模型匹配 2、步骤 1)提取模型的特征 2)在图像中查找特征点 3)进行特征匹配 4)模型匹配 3、参数及用法 1、用法 2、参数 1)image:待搜索对象 2)templ&am…

【2025】基于python的网上商城比价系统、智能商城比价系统、电商比价系统、智能商城比价系统(源码+文档+解答)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

RTR_Chapter_4_中

四元数 四元数可以用于表示旋转和方向,它在很多地方都比欧拉角和矩阵表示更加优秀。任何三维方向都可以表示为一个绕特定轴的简单旋转,给定一个旋转轴和旋转角度,可以直接将其转换为一个四元数,或者是从一个四元数中提取出旋转轴和…

大数据与人工智能:脑科学与人工神经网络ANN

文章目录 大数据与人工智能:脑科学与人工神经网络ANN一、引言ANN简介研究背景与应用领域发展背景应用场景 二、ANN背后的人脑神经网络人脑神经网络的专业描述神经元的结构信号处理 思考和认知过程认知功能的实现 对机器学习算法的启示 三、ANN的研究进展初始阶段&am…

进程间通信-进程池

目录 理解​ 完整代码 完善代码 回收子进程&#xff1a;​ 不回收子进程&#xff1a; 子进程使用重定向优化 理解 #include <iostream> #include <unistd.h> #include <string> #include <vector> #include <sys/types.h>void work(int rfd) {…

Amazing!精准可控新视角视频生成+场景级3D生成!北大港中文腾讯等开源ViewCrafter

论文链接: https://arxiv.org/abs/2409.02048 GitHub链接&#xff1a;https://github.com/Drexubery/ViewCrafter 项目链接: https://drexubery.github.io/ViewCrafter/ Demo链接: https://huggingface.co/spaces/Doubiiu/ViewCrafter 亮点直击 本文提出了一种迭代视图合成策略…

java设计模式(持续更新中)

1 设计模式介绍 设计模式代表了代码的最佳实践&#xff0c;被有经验的开发人员使用。设计模式是很多被反复使用并知晓的&#xff0c;主要是对代码和经验的总结。使用设计模式是为了重用代码&#xff0c;并让代码更容易被人理解&#xff0c;保证代码的可靠性。对接口编程而不是…

双向dfs,多次dfs

前言&#xff1a;这个答案给我们提供了一种多次dfs的思路&#xff0c;记录queue的size&#xff0c;每次只取size个&#xff0c;就刚刚好只处理了上一次的‘ 题目地址 #include<bits/stdc.h> using namespace std;//定义队列节点 struct node {int x,y; }rear,front; //Q[…

JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看

一 jvm的内存模型 2.1 jvm内存模型概览 2.2 pc计数器 它是一块很小的内存空间&#xff0c;集合可以忽略不记&#xff0c;也是运行速度最快的存储区域。不会随着程序的运行需要更大的空间。 在jvm规范中&#xff0c;每个线程都有它自己的程序计数器&#xff0c;是线程私有的&…

二、栈和队列-算法总结

文章目录 二、栈和队列2.1 基本应用2.1.1 逆波兰表达式求值2.1.2 有效的括号 2.2 单调栈2.2.1 柱状图中最大的矩形 二、栈和队列 2.1 基本应用 2.1.1 逆波兰表达式求值 150. 逆波兰表达式求值 class Solution {/**思路分析&#xff1a;遇到数则压栈&#xff0c;遇到运算符…

【深度学习】线性回归的从零开始实现与简洁实现

前言 我原本后面打算用李沐老师那本《动手学深度学习》继续“抄书”&#xff0c;他们团队也免费提供了电子版(https://zh-v2.d2l.ai/d2l-zh-pytorch.pdf)。但书里涉及到代码&#xff0c;一方面展示起来不太方便&#xff0c;另一方面我自己也有很多地方看不太懂。 这让我开始思…

Arm GIC-v3中断原理及验证(通过kvm-unit-tests)

一、参考连接 gic-v3相关原理可参考https://zhuanlan.zhihu.com/p/520133301 本文主要通过开源测试工具kvm-unit-tests&#xff0c;针对GIC的中断进行一系列验证&#xff0c;这样可以直入中断底层&#xff0c;熟悉整个原理。 kvm-unit-tests官网为kvm-unit-tests / KVM-Unit…

labview禁用8080端口

需求背景 最近电脑上安装了labview全家桶,发现idea的8080端口项目启动报错,一直提示8080端口被占用。最简单的办法就是找到8080端口的服务,然后关闭这个服务。但是我不想这么做,我想把labview的web服务器的端口给修改了。 操作教程 1、cmd查看8080端口 2、windows进程 同…

022.PL-SQL进阶—分页过程

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

Flask 实现用户登录功能的完整示例:前端与后端整合(附Demo)

目录 前言Demo 前言 对于python用户的登录&#xff0c;以下只是提供一个Demo用于学习 更多的python知识点可从我的专栏中进行学习 python专栏详细分析Flask中的蓝图Blueprint&#xff08;附Demo&#xff09;详细分析Flask部署云服务器&#xff08;图文介绍&#xff09;构建F…

2024 年 GitLab Global DevSecOps 报告解读

近日 GitLab 正式发布了 2024 年 GitLab Global DevSecOps 报告&#xff0c;报告主题为 What’s next in DevSecOps。在全球有超 5000 位 IT 人员参与了该报告的调研&#xff0c;超 70% 为企业管理者&#xff0c;50% 以上的受访者所在企业规模超过 500人。该报告深刻揭示了在 A…

深度学习_GPT2Block详解(casual attention)

一、GTP2Block 整体结构 1.1 block准备 import torch from torch import nn from transformers import GPT2Model, GPT2Config from transformers.models.gpt2.modeling_gpt2 import GPT2Blockcfg GPT2Config() print(cfg.add_cross_attention) blk GPT2Block(cfg, layer_…