linux openssl C++ md5开发实例

文章目录

  • 一、MD5 介绍
  • 二、MD5 原理
  • 三、MD5 C++开发实例
  • 四、生日冲突算法

一、MD5 介绍

MD5(Message Digest Algorithm 5)是一种广泛用于产生消息摘要(哈希值)的算法。MD5 属于 MD(Message Digest)家族,设计用于生成128位(16字节)的哈希值。然而,由于其设计上的一些弱点,MD5 在一些安全应用中被认为不再安全。

以下是 MD5 的一些特点和用途:

  1. 固定输出长度: MD5 生成的哈希值始终是128位长,不论输入的长度如何。

  2. 快速计算: MD5 的计算速度相对较快,适用于对大量数据进行哈希的场景。

  3. 不可逆性: MD5 是一个单向哈希函数,即从哈希值不能逆向推导出原始输入。

  4. 抗碰撞性: MD5 的抗碰撞性较差,即找到两个不同的输入产生相同的哈希值的可能性相对较高。这使得 MD5 在某些安全场景下不再适用。

  5. 广泛应用: 在过去,MD5 曾被广泛用于校验文件完整性、存储密码等。然而,由于其已知的弱点,现在在许多安全应用中不再建议使用。

  6. 安全性问题: MD5 已经被证明对碰撞性攻击是脆弱的,即攻击者可以找到两个不同的输入,它们产生相同的 MD5 哈希值。因此,MD5 在密码存储和数字签名等领域的使用不再被推荐。

由于 MD5 的不足,安全专家现在更倾向于使用更强大的哈希算法,例如 SHA-256 和 SHA-3。在安全敏感的应用中,不建议使用 MD5。

二、MD5 原理

MD5(Message Digest Algorithm 5)是一种使用散列函数生成固定长度(128位或16字节)消息摘要的算法。MD5 的原理涉及多轮迭代、逻辑运算和特定的置换函数。以下是 MD5 算法的基本原理:

  1. 填充(Padding): MD5 对输入进行填充以确保其长度是64的整数倍。填充通常是在消息的末尾添加比特位。填充的最后64位表示消息的原始长度。

  2. 初始化变量(Initialization): MD5 使用4个32位的寄存器(A、B、C、D)作为其内部状态。这些寄存器初始设置为特定的常量值。

  3. 分块处理(Processing Blocks): MD5 将填充后的消息分成512位的块,每个块包含16个32位字。对于每个块,MD5 进行一系列的操作来更新内部状态寄存器。

  4. 循环操作(Rounds): MD5 算法包括64个循环操作,每个操作中使用不同的置换函数、常数和位移。这些操作对寄存器进行更新,并使用消息块中的字。

  5. 置换函数(Round Functions): 每个循环操作包括四轮,其中使用一个置换函数。这些置换函数是位运算、逻辑运算和非线性函数的组合。它们被设计为在每轮中引入复杂性,增加算法的抗碰撞性。

  6. 结果生成(Output Digest): 最后一轮操作完成后,MD5 将四个寄存器的内容连接成一个128位的哈希值,这就是 MD5 的输出。

MD5 的弱点主要来自于其设计上的一些缺陷,这导致在现代密码学中不再被认为是安全的。尤其是碰撞性攻击,即找到两个不同的输入,它们产生相同的 MD5 哈希值,已经被广泛证明是可行的。因此,在安全应用中,推荐使用更强大和安全的哈希算法,如 SHA-256 或 SHA-3。

三、MD5 C++开发实例

在使用 OpenSSL 进行 MD5 哈希的 C++ 示例中,你可以使用 OpenSSL 的 EVP 库。以下是一个简单的示例代码,演示如何在 Linux 上使用 OpenSSL 进行 MD5 哈希:

#include <iostream>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>std::string md5(const std::string &input) {// 初始化 OpenSSL 的 EVPEVP_MD_CTX *mdctx;const EVP_MD *md;mdctx = EVP_MD_CTX_new();md = EVP_md5();// 初始化 MD5 上下文EVP_DigestInit_ex(mdctx, md, NULL);// 更新上下文EVP_DigestUpdate(mdctx, input.c_str(), input.length());// 获取 MD5 结果unsigned char md_value[EVP_MAX_MD_SIZE];unsigned int md_len;EVP_DigestFinal_ex(mdctx, md_value, &md_len);// 释放上下文EVP_MD_CTX_free(mdctx);// 将结果转为十六进制字符串std::string result;for (unsigned int i = 0; i < md_len; i++) {char hex[3];sprintf(hex, "%02x", md_value[i]);result += hex;}return result;
}int main() {std::string input = "Hello, MD5!";std::string hash = md5(input);std::cout << "Input: " << input << std::endl;std::cout << "MD5 Hash: " << hash << std::endl;return 0;
}

在这个例子中,我们使用 OpenSSL 的 EVP 库计算输入字符串的 MD5 哈希。请确保你的系统上已经安装了 OpenSSL 库,并且在编译时链接了相应的库。你可以使用以下命令编译这个程序:

g++ -o md5_example md5_example.cpp -lssl -lcrypto

这个程序会输出输入字符串和相应的 MD5 哈希值。请注意,对于安全性要求高的应用,不再建议使用 MD5,而是应该考虑更强大和安全的哈希函数,例如 SHA-256。

四、生日冲突算法

生日攻击是一种哈希函数攻击方法,其名称来自于生日悖论。生日悖论指的是在一个群体中,只需要有23个人,就有一半以上的概率至少有两个人生日相同。在哈希函数中,生日攻击利用了这种悖论,试图找到两个不同的输入,它们产生相同的哈希值。

对于 MD5 这样的128位哈希函数,生日攻击的复杂度是264,因为哈希值的位数是128位。这意味着,在经过264个不同的输入尝试后,有一半以上的概率会找到两个具有相同哈希值的输入。

生日攻击的基本步骤如下:

  1. 选择随机输入: 从输入空间中选择随机的不同输入。

  2. 计算哈希值: 对每个输入计算哈希值。

  3. 查找碰撞: 检查已计算的哈希值,看是否有两个不同的输入具有相同的哈希值。

  4. 重复: 如果没有找到碰撞,重复这个过程。

由于生日攻击的复杂度相对较低,MD5 已经被证明对碰撞性攻击是脆弱的,而且可以在相对较短的时间内找到碰撞。因此,MD5 不再被推荐用于对安全性要求较高的场景,如密码存储或数字签名。

对抗生日攻击的一种方式是使用更长的哈希函数,例如 SHA-256 或 SHA-3,它们的输出比 MD5 更长,从而提高了生日攻击的复杂度。

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

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

相关文章

mysql主从复制-使用心得

文章目录 前言环境配置主库从库 STATEMENTbinloggtidlog-errorDistSQL总结 前言 mysql 主从复制使用感受&#xff0c;遇到一些问题的整理&#xff0c;也总结了一些排查问题技巧。 环境 mysql5.7 配置 附&#xff1a;千万级数据快速插入配置可以参考&#xff1a;mysql千万数…

HarmonyOS应用开发者高级认证(88分答案)

看好选择题&#xff0c;每个2分多答对2个刚好88分&#xff0c;祝你顺利。 其它帮扶选择题。 一、判断 只要使用端云一体化的云端资源就需要支付费用&#xff08;错&#xff09;所有使用Component修饰的自定义组件都支持onPageShow&#xff0c;onBackPress和onPageHide生命周期…

Spring-AOP不生效之内部方法调用

Spring-AOP 现象&#xff1a;接口实现类中有两个&#xff0c;doMethod1()调用了doMethod2(),此时对于AOP&#xff0c;如果现在外部对象调用doMethod1()方法的时候&#xff0c;会发现只有doMethod1()方法执行被拦截,AOP生效&#xff0c;而doMethod1()内部调用doMethod2()时并没…

vue3配置环境变量,小白简单易学

环境变量的意义就是防止我们更新打包的时候写错变量&#xff0c;合并代码这些一系列问题 首先看看效果 左边是本地测试环境&#xff0c;右边是打包后的生产环境&#xff0c;写这个环境变量的好处就是&#xff0c;你在本地开发的时候变量随便改&#xff0c;不会影响生产环境&am…

07【保姆级】-GO语言的程序流程控制【if switch for while 】

之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&#xff0c;然后know why。先做出来&#xff0c;然后再去一点点研究&#xff0c;才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构

在前文中&#xff0c;我们介绍了组合模式的基本原理和应用&#xff0c;以及它在构建对象结构中的价值和潜力。然而&#xff0c;组合模式的魅力远不止于此。在本文中&#xff0c;我们将继续探索组合模式的进阶应用&#xff0c;并展示它与其他设计模式的结合使用&#xff0c;以构…

2024 款:最新前端技术趋势

Hello&#xff0c;大家好&#xff0c;我是 Sunday。 上一次的时候聊了 那么些已经落后的前端开发技术 。但是光知道什么技术落后了是不够的&#xff0c;咱们还得知道 前端最新的技术趋势是什么。所以&#xff0c;今天这篇文章&#xff0c;咱们就来聊一聊&#xff0c;2023 最新…

Spring后端HttpClient实现微信小程序登录

这是微信官方提供的时序图。我们需要关注的是前后端的交互&#xff0c;以及服务端如何收发网络请求。 小程序端 封装基本网络请求 我们先封装一个基本的网络请求。 const baseUrl"localhost:8080" export default{sendRequsetAsync } /* e url&#xff1a;目标页…

对比国内主流开源 SQL 审核平台 Yearning vs Archery

Yearning, Archery 和 Bytebase 是目前国内最主流的三个开源 SQL 审核平台。其中 Yearning 和 Archery 是社区性质的项目&#xff0c;而 Bytebase 则是商业化产品。通常调研 Bytebase 的用户也会同时比较 Yearning 和 Archery。 下面我们就来展开对比一下 Yearning 和 Archery…

DRAM和SRAM

特点 Static Random Access Memory&#xff1a;速度快、存储一位需要元器件更多、功耗较大、集成度低、更贵 Dynamic Random Access Memory&#xff1a;容量大、需刷新、附属电路更复杂、功耗较小、集成度高 存储位元 SRAM DRAM 逻辑结构 SRAM 典型的SRAM芯片有6116&am…

Layer 2 真的为以太坊扩容了吗?

构建一个安全、对用户友好的去中心化网络的愿景&#xff0c;依赖于关键基础设施的发展。这个愿景由一个共享的经济框架支持&#xff0c;得到了亿万人的拥护。Layer 2 的扩展解决方案在构建这一基础和增强以太坊的能力方面起着至关重要的作用。这些项目相互协作&#xff0c;形成…

数据结构—数组栈的实现

前言&#xff1a;各位小伙伴们我们前面已经学习了带头双向循环链表&#xff0c;数据结构中还有一些特殊的线性表&#xff0c;如栈和队列&#xff0c;那么我们今天就来实现数组栈。 目录&#xff1a; 一、 栈的概念 二、 栈的实现 三、 代码测试 栈的概念&#xff1a; 栈的概念…

【nlp】1.3 文本数据分析(标签数量分布、句子长度分布、词频统计与关键词词云)

文本数据分析 1 文本数据分析介绍2 数据集说明3 获取标签数量分布4 获取句子长度分布5 获取正负样本长度散点分布6 获取不同词汇总数统计7 获取训练集高频形容词词云8 获取验证集形容词词云1 文本数据分析介绍 文本数据分析的作用: 文本数据分析能够有效帮助我们理解数据语料…

[100天算法】-不同路径 III(day 75)

题目描述 在二维网格 grid 上&#xff0c;有 4 种类型的方格&#xff1a;1 表示起始方格。且只有一个起始方格。 2 表示结束方格&#xff0c;且只有一个结束方格。 0 表示我们可以走过的空方格。 -1 表示我们无法跨越的障碍。 返回在四个方向&#xff08;上、下、左、右&#…

(selenium element not interactable)selenium的send_keys怎么往codemirror中发送数据

简直了&#xff0c;什么方法都试过了&#xff0c;什么鼠标悬停、修改js都不行。最后居然就是定位到textarea域&#xff0c;再定位到想插入文本的位置的前面&#xff08;我理解就是定位到cursor游标&#xff09;&#xff1b;然后点击以显示游标&#xff1b;最后往textarea域send…

【PG】PostgreSQL 预写日志(WAL)、checkpoint、LSN

目录 预写式日志&#xff08;WAL&#xff09; WAL概念 WAL的作用 WAL日志存放路径 WAL日志文件数量 WAL日志文件存储形式 WAL日志文件命名 WAL内容 检查点&#xff08;checkpoint&#xff09; 1 检查点概念 2 检查点作用 触发检查点 触发检查点之后数据库操作 设置合…

【图论实战】Boost学习 01:基本操作

文章目录 头文件图的构建图的可视化基本操作 头文件 #include <boost/graph/adjacency_list.hpp> #include <boost/graph/graphviz.hpp> #include <boost/graph/properties.hpp> #include <boost/property_map/property_map.hpp> #include <boost/…

数据结构之队列

目录 引言 队列的概念与结构 队列的实现 定义 初始化 销毁 入队 判断队列是否为空 出队 获取队头元素 获取队尾元素 检测队列中有效元素个数 元素访问 源代码 queue.h queue.c test.c 引言 数据结构之路经过栈后&#xff0c;就来到了与栈联系紧密的兄弟—…

RabbitMq防止消息丢失

RabbitMq防止消息丢失 消息的传递路径出现消息丢失的位置解决 消息的传递路径 消息发送方 --> MQ --> 消息消费方 出现消息丢失的位置 消息发送方: 消息传输过程中丢失MQ: MQ收到消息后,存在内存中,还未被消费就宕机了,导致数据丢失消息消费方: 消息到达消费方后, 服务…

Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)

目录 一、从空白系统中克隆Centos7系统 二、使用xshell连接docker_tigerhhzz虚拟机​编辑 三、在CentOS7基础上安装Docker容器 四、在Docker中进行安装Portainer 4.1、在Docker中安装MySQL 4.2、在Docker中安装JDK8&#xff0c;安装Java环境 4.3、Docker安装redis&#…