数字安全一之消息摘要

一、消息摘要的定义

消息摘要(Message Digest)是加密术语中一种通过散列函数生成的【固定长度的字符串】。它是对任意长度的输入消息(如文件、字符串等)进行处理后产生的【固定长度的唯一标识符】

二、消息摘要的作用

完整性校验:通过生成消息的摘要值,可以在接收方对收到的消息进行相同的摘要计算,若摘要值相同,说明消息未被篡改;若摘要值不同,则表明消息可能被修改。

数字签名:消息摘要是数字签名算法的重要组成部分。发送方可以通过对消息摘要进行加密,生成数字签名,接收方则可以通过解密并对消息进行摘要比对,确保消息的真实性和完整性。

快速比较:由于消息摘要是固定长度且唯一的标识符,可以用它快速比较两条消息是否相同,而不需要逐字节比较消息内容。

常见的消息摘要算法有 MD5、SHA-1、SHA-256 等。尽管 MD5 和 SHA-1 已不再安全,SHA-256 及其他更高级的算法仍然被广泛使用。

三、摘要算法
3.1、SHA-256 (安全散列算法)

SHA名称来自于安全散列算法(英语:Secure Hash Algorithm)的缩写,一种密码散列函数算法标准,由美国国家安全局研发(NSA)。

它们的【摘要长度】(以比特计算)加在原名后面来命名:SHA-256,SHA-384和SHA-512。

SHA-256固定长度输出:无论输入的大小,输出总是 256 位(32 字节)

3.2、MD5 (信息摘要算法)

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

3.3、SHA-256和md5比较

特性

SHA-256

MD5

哈希输出长度

256 位(32 字节)

128 位(16 字节)

安全性

非常安全,适合密码学应用

不安全,已被淘汰

抗碰撞能力

极强,尚无实用碰撞攻击

已被破解,容易找到碰撞

应用场景

密码学、区块链、数字签名等

文件校验等非安全场景

速度

较慢,运算复杂

较快,运算轻量

设计者

美国国家安全局 (NSA)

Ronald Rivest

发布日期

2001

1991

3.4、代码实现
3.4.1 sha-256
    // SHA-256 java版本实现import java.security.MessageDigest;public class SHA256Example {public static void main(String[] args) throws Exception {String input = "hello";// 获取 SHA-256 实例MessageDigest digest = MessageDigest.getInstance("SHA-256");// 计算哈希值byte[] hash = digest.digest(input.getBytes("UTF-8"));// 将字节数组转为十六进制字符串StringBuilder hexString = new StringBuilder();for (byte b : hash) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) hexString.append('0');hexString.append(hex);}System.out.println(hexString.toString());  // 输出64个字符的十六进制字符串}}
3.4.2、md5
	import java.security.NoSuchAlgorithmException;public class MD5Example {public static void main(String[] args) {String input = "Hello, World!";try {// 创建 MD5 算法的 MessageDigest 实例MessageDigest md = MessageDigest.getInstance("MD5");// 将输入字符串转换为字节数组并更新到摘要中byte[] messageDigest = md.digest(input.getBytes("UTF-8"));// 将字节数组转换为十六进制格式的字符串StringBuilder hexString = new StringBuilder();for (byte b : messageDigest) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) {hexString.append('0'); // 补零确保每个字节是两位数}hexString.append(hex);}// 输出 MD5 哈希值System.out.println("MD5 Hash of '" + input + "': " + hexString.toString());} catch (NoSuchAlgorithmException e) {// 捕获当系统不支持 MD5 算法时的异常System.err.println("MD5 Algorithm not found.");} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}}
}
3.5、SHA-256输出长度为256位(32字节)转64长度的字符串

这是因为该输出使用了 十六进制(Hex)编码 表示。
1.SHA-256 输出的本质:SHA-256 的散列值是一个 256 位 的二进制数字,即 32 字节(每个字节 8 位)。
2.十六进制编码:为了更容易查看和传输,通常将二进制数据用十六进制表示。十六进制用 16 个字符来表示二进制(每个字符 4 位),因此每个字节(8 位)可以用 2 个十六进制字符表示。
3.长度计算:如果 SHA-256 的输出是 32 字节(256 位),使用十六进制编码时,每个字节需要 2 个十六进制字符来表示,因此最终的输出长度为64个字符的字符串
4.(每个字符 4 位):每个字符 4 位的概念是指在 十六进制(Hexadecimal)编码中,一个十六进制字符可以表示 4 位二进制数字。这是因为十六进制是一种基数为 16 的数制,范围从 0 到 F,而这些字符可以直接映射到二进制的 4 位表示

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

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

相关文章

[译] K8s和云原生

本篇内容是根据2019年8月份Kubernetes and Cloud Native音频录制内容的整理与翻译, Johnny 和 Mat 与 Kris Nova 和 Joe Beda 一起探讨了 Kubernetes 和云原生。他们讨论了 Kubernetes 推动的“云原生”应用的兴起、使用 Kubernetes 的合适场合、运行如此大型的开源项目所面临…

云服务器(华为云)安装java环境。

这篇文章主要是介绍如何搭建华为云服务器中的java环境,也就是jdk的安装。 这里华为云服务器使用的是liunx系统。 uname -a Linux操作系统的版本信息。具体来说,它表明使用的是Ubuntu系统,内核版本是5.15.0,构建于2023年1月20日&a…

linux配置git

一、生成新的 SSH 密钥 ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 按照提示操作: 当提示 Enter file in which to save the key (/root/.ssh/id_rsa): 时,直接按回车键使用默认路径。 当提示 Enter passphrase (empty for no p…

基于Java+Jsp+SpringMVC漫威手办商城系统设计和实现

基于JavaJspSpringMVC漫威手办商城系统设计和实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 &am…

pycharm下载selenium等软件包时提示下载超时

1.问题描述 我今天在pycharm运行刚写的自动化脚本时,提示selenium模块未导入(自动到导入),鼠标移动到【from selenium import webdriver]的selenium时,显示【未存在文档】 2 解决办法 文件--设置--项目:当前…

手写SpringMVC(简易版)

在上一篇博客中说到这里我们要进行手写SpringMVC,因此最好是将上一篇博客中的SpringMVC源码分析那一块部分搞懂,或者观看动力节点老杜的SpringMVC源码分析再来看这里的书写框架。 首先我们要知道对于一个完整系统的参与者(即一个完整的web项…

CentOS 安装 JAVA环境(JDK 1.8)

镜像选择 推荐国内镜像直接下载 清华镜像 https://mirrors.tuna.tsinghua.edu.cn/Adoptium 关于重命名 AdoptOpenJDK 镜像为 Adoptium 的通知 编程宝库 http://www.codebaoku.com/jdk/jdk-index.html 这个镜像站,包含Oracle JDK、OpenJDK、AdoptOpenJDK、阿里…

Android平台使用VIA创建语音交互应用

Android平台使用VIA创建语音交互应用 概述 在 Android 平台上开发一款语音助手应用需要整合多种技术,包括语音识别(ASR)、文字转语音(TTS)、以及热词检测(Hotword Detection)。这些技术共同构成了语音助手应用的核心交互方式,使用户能够通过语音命令与设备进行无缝交…

Maya学习笔记:物体的层级关系

文章目录 父子关系设置父子关系同时显示两个大纲视图 组 父子关系 设置父子关系 设置父子物体: 方法1 先选择子物体,按住shift再选中父物体,按P或者G键 方法2 在大纲视图中按住鼠标中间,拖动一个物体到另一个物体上 取消父子关…

公安局软件管理平台建设方案和必要性,论文-———未来之窗行业应用跨平台架构

一、平台方略 由于csdn拦截关键信息,我发发布方案,请留意后面文章

Oracle逻辑备份脚本【生产环境适用】

1 说明 从Oracle10g开始,引入了数据泵(Data Pump),是一种高效的数据传输工具,它通过导出(Export)和导入(Import)的方式帮助用户迁移数据。 在Oracle的产品设计中&#…

详解机器学习经典模型(原理及应用)——K-Means

一、K-Means算法概念 K-Means 算法是一种经典的聚类分析方法,属于无监督学习的一种。它的目标是将数据集中的样本划分为预定数量的簇,使得簇内的样本尽可能相似,而簇间的样本尽可能不同。K-Means在业务中也有诸多用途,比如在进行探…

Github + Hexo + Shoka搭建个人博客以及遇到的部分问题

博客预览: 主页: 文章: 博客语言链接: 全部分类 |mmjon 不在能知,乃在能行 Shoka官方博客: Yume Shoka 優萌初華 有夢書架 (lostyu.me) 1、准备 1、github账号 :自行去github官网注册…

睡眠监测系统基于边缘计算和微服务缓存

这篇论文的主要内容是关于基于边缘计算和微服务缓存的睡眠监测系统。以下是详细内容概述: 标题 睡眠监测系统基于边缘计算和微服务缓存 作者 Nico Surantha - 东京市立大学,日本David Jayaatmaja - 雅加达Bina Nusantara大学,印度尼西亚S…

Java面向对象(类和对象)(自己学习整理的资料)

目录 一.面向对象思想 二.类和对象 三:定义类的步骤 四.创建对象 五.用Java代码写一个简单的登录系统 练习 六.关于类的方法 七.类的无参无返回值方法 八.方法的返回值 练习 关于方法调用问题 九.全局变量和局部变量 十.笔记 一.面向对象思想 就只关注参…

FDA辅料数据库在线免费查询-药用辅料

在药物制剂的研制过程中,需要确定这些药用辅料的安全用量。而美国食品药品监督管理局(FDA)的辅料数据库(IID)提供了其制剂研发中的关键参考资源,使得更多的医药研发相关人员及企业单位节省试验环节及时间成…

快速学会一个算法,BERT

今天给大家介绍一个强大的算法模型,BERT BERT(Bidirectional Encoder Representations from Transformers)是一种基于 Transformer 架构的深度学习模型,主要用于处理自然语言处理(NLP)问题。 BERT 由 Goo…

星辰计划-深入理解kafka的消息存储和索引设计

消息存储 提到存储不得不说消息的读写,那么kafka他是如何读写数据的呢? 读取消息 1.通过debug(如何debug) 我们可以得到下面的调用栈,最终通过FileRecords来读取保存的数据 写入消息 1.通过debug(如何debug) 我们可以得到下面的调用栈&am…

模型django封装uvicorn服务器部署实战

Uvicorn 是一个轻量级的 ASGI 服务器,它基于 uvloop 和 httptools 这两个高性能的异步库。Uvicorn 提供了快速的启动时间和低延迟的响应,非常适合用于生产环境。 Django: 是一个开源且强大的Web框架,适用于快速开发和部署Python …

深度学习——线性回归

房价预测 线性模型 单层神经网络 损失函数的均方误差 训练数据 参数学习 显示解 偏导数少了负号 最优解y旁边的X少了转置符号 梯度下降 学习率选择 小批量随机梯度下降 批量规模的选择 总结