【OpenSSL】单向散列函数

什么是单向散列函数

  1. 任意长度数据生成固定长度是散列
  2. 快速计算
  3. 消息变化散列变化
  4. 单向不可逆,抗碰撞

应用场景

  1. 文件完整性
  2. 口令加密
  3. 消息认证
  4. 伪随机数
  5. 配合非对称加密做数字签名
  6. 比特币工作量证明

单向hash抗碰撞

弱抗碰撞

给定Xhash值的情况下,找到另外个数,hash值相同。

强抗碰撞

  • 找到散列值相同的两个字符串
  • MD5,SHA-1已经被攻破可以找到相同散列值的不同消息

常用的Hash算法

  • MD5
  • SHA1
  • SHA2(SHA-256 SHA-384 SHA-512)
  • SHA3 Keccak256 选举产生
  • 国密SM3

MD5算法

  • 消息摘要(Message Digest)
  • 产生128比特(16字节) 散列值(RFC1321)
  • 强抗碰撞已经被破, 2004年王小云攻破
  • 已经不安全, 如果应用加salt
  • 历史系统最广泛,效率高

原理

  1. 补结尾处的字节, 取余448,补1后再补0,补足到448位
  2. 剩余64位做存储原始数据的长度
  3. 初始化MD缓冲, A: 01 23 45 67,B:89 1b cd ef …
  4. 4个函数处理消息块

Open SSL实现MD5

#include <iostream>
#include <openssl/md5.h>using namespace std;//将二进制转换成16进制的文本字符
string char2Hex(unsigned char *out,  int len)
{const unsigned char hex_chars[] = "0123456789ABCDEF";string result;for (int i = 0; i < len; i++) {unsigned char ch = out[i];unsigned int hc = (ch >> 4) & 0xf;unsigned int lc = ch & 0x0f;//采用大端存储的方式拼接result += hex_chars[hc];result += hex_chars[lc];}return result;
}string MD5Hash(unsigned char *data, size_t len)
{//初始化MD5环境MD5_CTX ctx;MD5_Init(&ctx);// 计算MD5hash数据MD5_Update(&ctx, data, len);//读取数据unsigned char out[16] = { 0 }; // 只有16个字节//把数据读取到out中MD5_Final(out, &ctx);return char2Hex(out, 16);
}//采用简化模式实现MD5
string MD5HashSimple(unsigned char* data, size_t len)
{//读取数据unsigned char out[16] = { 0 }; // 只有16个字节//把数据读取到out中MD5(data, len, out);return char2Hex(out, 16);
}int main(int argc, char* argv[])
{unsigned char data[] = "测试md5数据";int len = sizeof(data);string result = MD5Hash(data, len);cout <<"MD5:"<<result<< endl;data[0] = '9';result = MD5HashSimple(data, len);cout << "MD5:" << result << endl;
}

计算文件的MD5值

string GetFileListHash(string filepath) 
{string hash;/ 以二进制方式ifstream ifs(filepath, ios::binary);if (!ifs)return hash;int block_size = 128;// 文件读取bufunsigned char buf[1024] = { 0 };//hash输出unsigned char out[1024] = { 0 };while (!ifs.eof()){ifs.read((char*)buf, block_size);int read_size = ifs.gcount();if (read_size < 0){ break; }MD5(buf, read_size, out);hash.insert(hash.end(), out, out + 16);}ifs.close();MD5((unsigned char*)hash.data(), hash.size(), out);return char2Hex(out, 16);
}

SHA-1算法

  • 安全散列算法(Secure Hash Algorithm)
  • 消息摘要(Message Digest)
  • 产生160比特(20字节) 散列值H0 H1 H2 H3 H4
  • 强抗碰撞已经攻破, 在2005年王小云攻破。
  • MD5一样都是由MD4导出。

代码演示

代码实现与MD5类似, 分为三步.

  1. 初始化SHA上下文
  2. 对数据进行hash计算
  3. 读取hash计算结果
    代码如下:
string SHA1Hash(unsigned char* data, size_t len)
{// 首先也是初始化SHA1的上下文SHA_CTX ctx;SHA1_Init(&ctx);// 编码数据SHA1_Update(&ctx, data, len);//读取数据unsigned char out[20];SHA1_Final(out, &ctx);//将字节内容转换为字符return char2Hex(out, 20);
}

同样,为了方便调用,open ssl对上述过程进行了封装。仅用一个SHA1函数即可实现以上3步。测试代码如下

//简化函数实现SHA1
string SHA1HashSimple(unsigned char* data, size_t len)
{unsigned char out[20];SHA1(data, len, out);return char2Hex(out, 20);
}

测试:

int main(int argc, char* argv[])
{// --- 测试MD5unsigned char data[] = "测试md5数据";int len = sizeof(data);// 测试SHA1string hash = SHA1Hash(data, len);cout << "SHA1:\t" << hash << endl;//简介函数测试hash = SHA1HashSimple(data, len);cout << "SHA1:\t" << hash << endl;return 0;
}

运行结果:
在这里插入图片描述
使用sha1测试Merkle Tree算法


//文件可信树
string GetFileMerkleHash(string filepath)
{string hash;// 存放hash列表, 后面所有结果都存在其中vector<string> hashs;ifstream ifs(filepath, ios::binary);if (!ifs){cout << "文件" << filepath << "不存在" << endl;return hash;}unsigned char buf[1024] = { 0 };unsigned char out[1024] = { 0 };int block_size = 128;while (!ifs.eof()){ifs.read((char*)buf, block_size);int read_size = ifs.gcount();if (read_size <= 0){break;}SHA1(buf, read_size, out);hashs.push_back(string(out, out + 20));}while (hashs.size() > 1) // ==1表示已经计算到root节点{// 不是二的倍数补节点(二叉树)if (hashs.size() & 1){hashs.push_back(hashs.back());}// 把hash结果的hash结果还吸入到hashs中for (int i = 0; i < hashs.size() / 2; i++){// 两个节点拼起来, i表示的父节点string tmp_hash = hashs[i * 2]; // 左节点tmp_hash += hashs[i * 2 + 1]; // 右节点SHA1((const unsigned char*)tmp_hash.data(), tmp_hash.size(), out);// 写入结果hashs[i] = string(out, out + 20);}// hash列表删除上一次多余的hash值hashs.resize(hashs.size() / 2);}if (hashs.size() == 0) return hash;return char2Hex((unsigned char*)hashs[0].data(), 20);
}

SHA-2算法

类别SHA-1SHA-224SHA-256SHA-384SHA-512
消息摘要长度160224256384512
消息长度小于 2 64 2^{64} 264小于 2 64 2^{64} 264小于 2 64 2^{64} 264小于 2 128 2^{128} 2128小于 2 128 2^{128} 2128
分组长度51251251210241024
计算字长度3232326464
计算步骤数8064648080
  • 消息填充摸512与448同余补充消息长度。
  • 初始化链接变量 缓冲区用8个32位寄存器(SHA256
  • 取自前8个素数(2、3、5、7、11、13、17、19)的平方根的小数部分其二进制表示的前32位 8 ∗ 32 = 256 8*32=256 832=256.
  • SHA512是用64位寄存器
  • 以512位(64)分组位单位处理, 进行64步循环, SHA512以1024(128)位为以个分组
  • SHA-384SHA-512也都有6个迭代函数
string SHA256Hash(const unsigned char* data, size_t len) 
{// 初始化SHA256的上下文SHA256_CTX ctx;SHA256_Init(&ctx);// 开始写入数据SHA256_Update(&ctx, data, len);// 读取数据unsigned char out[32] = {0};SHA256_Final(out, &ctx);return char2Hex(out, 32);
}
string SHA256HashSimple(const unsigned char* data, size_t len) 
{unsigned char out[32];SHA256(data, len, out);return char2Hex(out, 32);
}

SHA-3算法

海绵结构, 把数据压到海绵里面。

  1. 填充,
  2. 分组4组
  3. 与初始值异或
    在这里插入图片描述

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

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

相关文章

怎么使用 Go 语言操作 Apache Doris

Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景。基于此&#xf…

buuctf-[网鼎杯 2020 朱雀组]phpweb

1.打开网站&#xff0c;吓我一跳 2.查看源代码&#xff0c;主要看到timezone&#xff0c;然后这个页面是五秒就会刷新一次 一开始去搜了这个&#xff0c;但是没什么用 3.使用bp抓包 会发现有两个参数&#xff0c;应该是用func来执行p 4.修改func和p file_get_contents&#…

7.网络原理之TCP_IP(上)

文章目录 1.网络基础1.1认识IP地址1.2子网掩码1.3认识MAC地址1.4一跳一跳的网络数据传输1.5总结IP地址和MAC地址1.6网络设备及相关技术1.6.1集线器&#xff1a;转发所有端口1.6.2交换机&#xff1a;MAC地址转换表转发对应端口1.6.3主机&#xff1a;网络分层从上到下封装1.6.4主…

HTTP 与 HTTPS

文章目录 HTTP协议一、什么是HTTP协议二、HTTP 协议通信过程三、URL什么是URI 四、HTTP报文1、请求报文&#xff08;1&#xff09;请求报文结构 2、响应报文&#xff08;1&#xff09;响应报文结构 五、HTTP请求方式1、GET&#xff1a;获取资源2、POST&#xff1a;提交数据增加…

巨人互动|Facebook海外户Facebook内容的类型

随着人们日益依赖的社交媒体来进行信息获取与交流&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;那么Facebook的内容都有哪些类型呢&#xff1f;下面小编来讲讲吧&#xff01; 1、实时发生的事 我们需要实时了解时事动态&#xff0c;这样可以使用户对品牌发…

三个要点,掌握Spring Boot单元测试

单元测试是软件开发中不可或缺的重要环节&#xff0c;它用于验证软件中最小可测试单元的准确性。结合运用Spring Boot、JUnit、Mockito和分层架构&#xff0c;开发人员可以更便捷地编写可靠、可测试且高质量的单元测试代码&#xff0c;确保软件的正确性和质量。 一、介绍 本文…

AWS SAA知识点整理(作成中)

共通 一些信息已经更新了&#xff0c;但参考题的答案还是旧的。 比如&#xff1a; S3的最大读写性能已经提高到 3,500 PUT/COPY/POST/DELETE or 5,500 GET/HEAD requests per second 并且不再要求使用random prefix 题目中有时候会让选择Not violation 不合适的一项&#xff…

mybatisPlus代码生成器

一、添加和mybatisPlus相关的依赖 二、创建代码生成器类 package com.example.mybatisplus_generator.generator;import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;public class Co…

智算创新,美格智能助力智慧支付加速发展

9月21日&#xff0c;以“智算引领创新未来”为主题的紫光展锐2023泛物联网终端生态论坛在深圳举行。作为紫光展锐重要战略合作伙伴&#xff0c;美格智能标准模组产品线总经理郭强华、高级产品总监刘伟鹏受邀出席论坛。美格智能基于紫光展锐5G、4G、智能SoC、Cat.1 bis等芯片平台…

SpringCloud 简单的了解

什么是SpringCloud ? 基于 Spring Boot 的 Spring 集成应用程序&#xff0c;它利用 Spring Boot 的开发便利性简化了分布式系统的开发&#xff0c;提供与外部系统的集成。 如服务注册与发现、配置中心、负载均衡、断路器、消息总线、数据监控等&#xff1b;换句话说&#xff…

Zilliz@阿里云:大模型时代下Milvus Cloud向量数据库处理非结构化数据的最佳实践

大模型时代下的数据存储与分析该如何处理?有没有已经落地的应用实践? 为探讨这些问题,近日,阿里云联合 Zilliz 和 Doris 举办了一场以《大模型时代下的数据存储与分析》为主题的技术沙龙,其中,阿里云对象存储 OSS 上拥有海量的非结构化数据,Milvus(Zilliz)作为全球最有…

飞致云开源社区月度动态报告(2023年9月)

自2023年6月起&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源大屏…

django_auth_ldap登录权限

用户登录权限分为三种&#xff0c;通过is_active,is_staff,is_superuser标识。可以对组赋予对应的权限。 设定active组、staff组和superuser组分别对应三种权限。在不同组权限下的登录情况如下&#xff1a; 当用户不属于任何一组&#xff1a; 登录失败&#xff0c;提示如图&a…

MonkeyRunner测试步骤

首先把安卓SDK的 环境变量给配置好&#xff0c;这里就不再多解释&#xff0c;自己google 然后将自己的安卓设备打开调试模式&#xff0c;USB连接至电脑&#xff0c;运行CMD,输入命令adb devices 查看你的安卓设备的ID&#xff08;ID后面写程序会调用&#xff09;&#xff0c;…

容器启动报错

容器启动报错 docker: Error response from daemon: driver failed programming external connectivity on endpoint XXX 如下&#xff1a; 据百度&#xff1a; 在docker启动后在&#xff0c;再对防火墙firewalld进行操作&#xff0c;就会发生上述报错 详细原因&#xff1a…

在EXCEL中构建加载项之创建加载项的目的及规范要求

【分享成果&#xff0c;随喜正能量】一句南无阿弥陀佛&#xff0c;本是释迦牟尼佛所证的无上正等正觉法&#xff0c;洒在娑婆世界的众生海中&#xff0c;只为末世众生能够以信愿之心抓住此救命稻草&#xff0c;要知道今世人此生的处境&#xff0c;可能只剩这道要么极乐要么三涂…

【DTEmpower案例操作教程】向导式建模

DTEmpower是由天洑软件自主研发的一款通用的智能数据建模软件&#xff0c;致力于帮助工程师及工科专业学生&#xff0c;利用工业领域中的仿真、试验、测量等各类数据进行挖掘分析&#xff0c;建立高质量的数据模型&#xff0c;实现快速设计评估、实时仿真预测、系统参数预警、设…

Android 导入ncnn-android-yolov8-seg : 实现人体识别和人像分割

1. 前言 上篇文章我们在Android中使用OpenCV实现了人脸识别&#xff0c;这篇文章我们使用OpenCVYOLOv8NCNN 来实现人像分割的功能。 首先来看下效果&#xff0c;这里会识别出人体&#xff0c;并会用蓝色的框框出来&#xff0c;并会有标签标注识别出的物体是什么&#xff0c;概…

038:mapboxGL 旋转地图(rotateTo)

第038个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中旋转地图。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共68行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozhuan…

1.centos7 安装显卡驱动、cuda、cudnn

安装conda 参考 python包 2.安装conda python库-CSDN博客3.Cenots Swin-Transformer-Object-Detection环境配置-CSDN博客 1.安装显卡驱动 步骤1&#xff1a;安装依赖 yum -y install kernel-devel yum -y install epel-release yum -y install gcc 步骤2&#xff1a;查询显…