当前位置: 首页 > news >正文

[ 加密 ] SHA256

SHA256 例程

一般文件的完整性要使用md5或者sha进行完整性校验,这里提供两个函数,

intact_update_sha 是计算指定文件SHA值并保存到SHA文件

intact_check_sha 计算文件SHA值并和SHA文件进行对比

编译方法:

gcc demo.c -lssl -lcrypto

#include <stdio.h>
#include <openssl/sha.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <openssl/md5.h>
#include <stdlib.h>enum {ERR_OK,ERR_FAIL,ERR_OPEN,ERR_OPEN_SHA,ERR_PATH,ERR_PARAM,ERR_NOEXIST,ERR_NOEXIST_SHA,ERR_KEY,ERR_MALLOC,};#define MAX_BUFFER_SIZE      1024
#define SHA_FILE_PATH        "/home/hfs/sha/%s.sha"
#define SHA_FILE_DIR         "/home/hfs/sha"static int intact_get_sha_file_path(char *path)
{int offset = 0;for (int i = 0; i < strlen(path); i++) {if (*(path + i) == '/')offset = i;}return offset;
}
int intact_check_sha(char *path)
{SHA256_CTX ctx;char buffer[MAX_BUFFER_SIZE];char sha_str[MAX_BUFFER_SIZE];int len = 0;FILE *fp = NULL;FILE *fp_sha = NULL;unsigned char sha[SHA256_DIGEST_LENGTH];char tmp[MAX_BUFFER_SIZE] = {0};char sha_file[MAX_BUFFER_SIZE] = {0};int offset;if (path == NULL) {return ERR_PARAM;}if (access(path, F_OK)) {return ERR_NOEXIST;}strcpy(tmp, path);if (tmp[strlen(tmp) - 1] == '/') {tmp[strlen(tmp) - 1] = '\0';}offset = intact_get_sha_file_path(tmp);if (offset == 0) {return ERR_PATH;}sprintf(sha_file, SHA_FILE_PATH, tmp + offset + 1);if (access(sha_file, F_OK)) {return ERR_NOEXIST_SHA;}fp = fopen(path, "r");if (fp == NULL) {  return ERR_OPEN;  }fp_sha = fopen(sha_file, "r");if (fp == NULL) {  fclose(fp);fp = NULL;return ERR_OPEN_SHA;  } SHA256_Init(&ctx);while ((len = fread(buffer, 1, MAX_BUFFER_SIZE, fp)) > 0) {SHA256_Update(&ctx, buffer, len);  memset(buffer, 0, sizeof(buffer));  } SHA256_Final(&(sha[0]), &ctx);sprintf(sha_str, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",sha[0], sha[1], sha[2], sha[3], sha[4], sha[5], sha[6], sha[7],sha[8], sha[9], sha[10], sha[11], sha[12], sha[13], sha[14], sha[15]);fread(buffer, 1, MAX_BUFFER_SIZE, fp_sha);if (strncmp(sha_str, buffer, 32) == 0) {fclose(fp);fp = NULL;fclose(fp_sha);fp_sha = NULL;return ERR_OK;}fclose(fp);fp = NULL;fclose(fp_sha);fp_sha = NULL;return ERR_FAIL;
}
int intact_update_sha(char *path)
{SHA256_CTX ctx;char buffer[MAX_BUFFER_SIZE];char sha_str[MAX_BUFFER_SIZE] = {0};int len = 0;FILE *fp = NULL;FILE *fp_sha = NULL;unsigned char sha[SHA256_DIGEST_LENGTH];char tmp[MAX_BUFFER_SIZE] = {0};char sha_file[MAX_BUFFER_SIZE] = {0};int offset;if (path == NULL) {return ERR_PARAM;}if (access(path, F_OK)) {return ERR_NOEXIST;}strcpy(tmp, path);if (tmp[strlen(tmp) - 1] == '/') {tmp[strlen(tmp) - 1] = '\0';}offset = intact_get_sha_file_path(tmp);if (offset == 0) {return ERR_PATH;}sprintf(sha_file, SHA_FILE_PATH, tmp + offset + 1);if (access(SHA_FILE_DIR, F_OK)) {mkdir(SHA_FILE_DIR, S_IRUSR | S_IWUSR | S_IXUSR);}fp = fopen(path, "r");if (fp == NULL) {  return ERR_OPEN;  }fp_sha = fopen(sha_file, "w+");if (fp == NULL) {  fclose(fp);fp = NULL;return ERR_OPEN_SHA;  } SHA256_Init(&ctx);while ((len = fread(buffer, 1, MAX_BUFFER_SIZE, fp)) > 0) {SHA256_Update(&ctx, buffer, len);  memset(buffer, 0, sizeof(buffer));  } SHA256_Final(&(sha[0]), &ctx);sprintf(sha_str, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",sha[0], sha[1], sha[2], sha[3], sha[4], sha[5], sha[6], sha[7],sha[8], sha[9], sha[10], sha[11], sha[12], sha[13], sha[14], sha[15]);fwrite(sha_str, 1, MAX_BUFFER_SIZE, fp_sha);fclose(fp);fp = NULL;fclose(fp_sha);fp_sha = NULL;return ERR_OK;
}

相关文章:

[ 加密 ] SHA256

SHA256 例程 一般文件的完整性要使用md5或者sha进行完整性校验&#xff0c;这里提供两个函数&#xff0c; intact_update_sha 是计算指定文件SHA值并保存到SHA文件 intact_check_sha 计算文件SHA值并和SHA文件进行对比 编译方法&#xff1a; gcc demo.c -lssl -lcrypto #…...

推荐一个windows上传linux服务器/linux服务器的docker镜像的工具,摆脱docker cp,以及解决常见问题。

Lrzsz&#xff0c;又称为lrz和lsz&#xff0c;是一个用于在Unix、Linux、macOS等操作系统上进行串行文件传输的工具。它支持基于X/Y/ZModem协议的文件传输&#xff0c;能够通过串口或者Telnet/SSH等网络连接进行文件传输。Lrzsz具有传输速度快、可靠性高、易于使用等特点&#…...

《QT从基础到进阶·三十五》QT插件实现侧边工具栏tabBar

tabBar是用QT插件实现的一个dll&#xff0c;对于插件的使用可以参考文章&#xff1a; 《QT从基础到进阶三十三》QT插件开发QtPlugin 源码放在文章末尾 该功能类似侧边工具栏&#xff0c;可以在该标签栏上添加自己开发的界面&#xff0c;实现代码如下&#xff1a; 1、所有功能…...

风丘电动汽车热管理方案 为您的汽车研发保驾护航

热管理技术作为汽车节能、提高经济性和保障安全性的重要措施&#xff0c;在汽车研发过程中具有重要作用。传统燃油汽车的热管理系统主要包括发动机、变速器散热系统和汽车空调&#xff0c;而电动汽车的热管理系统在燃油汽车热管理架构的基础之上&#xff0c;又增加了电机电控热…...

每日一练 | 华为认证真题练习Day134

1、开启标准STP协议的交换机可能存在哪些端口状态&#xff1f;&#xff08;多选&#xff09; A. Discarding B. Listening C. Disabled D. Forwarding 2、下列路由协议中优先级最高的是&#xff1f; A. Direct B. RIP C. OSPF D. Static 3、参考如图所示的输出结果&…...

python连接hive报错:TypeError: can‘t concat str to bytes

目录 一、完整报错 二、解决 三、 其他报错 四、impala方式连接hive 或者直接使用 pip install pyhive[hive] 安装。需要先 pip uninstall pyhive。 一、完整报错 Traceback (most recent call last): File "D:/Gitlab/my_world/hive2csv.py", line 18, in <…...

虹科示波器 | 汽车免拆检修 | 2015款奔驰G63AMG车发动机偶尔自动熄火

一、故障现象 一辆2015款奔驰G63AMG车&#xff0c;搭载157发动机&#xff0c;累计行驶里程约为9.4万km。车主反映&#xff0c;该车低速行驶时&#xff0c;发动机偶尔会自动熄火&#xff0c;故障大概1个星期出现1次。 二、故障诊断 接车后路试&#xff0c;故障未能再现。用故障检…...

10 Redis的持久化

Redis支持RDB和AOF两种持久化机制 1、RDB(Redis DataBase) 是对命令的全量快照随着key的数量增大&#xff0c;那么写入磁盘的开销也会越来越大 2、RDB文件的生成是否会阻塞主线程 save: 使用save的方式会阻塞主线程&#xff0c;影响redis的性能 bgsave: 一般情况下不会阻塞…...

【Linux入侵日志排查】

在Linux系统中&#xff0c;不同的服务和应用程序可能会产生不同格式的日志记录。以下是一些常见类型的日志文件及其格式说明&#xff1a; 以下是一些常见的 Linux 日志字段格式说明&#xff0c;以及具体的示例&#xff1a; /var/log/auth.log&#xff1a;此日志文件包含与身份…...

从哪些方面分析Linux内核源码

从这些方面分析Linux内核源码&#xff0c;这里提供一个大致的大纲&#xff1a; 一、Linux内核源码概述 1. 什么是Linux内核&#xff1f; 2. Linux内核的主要功能 3. Linux内核的版本控制 4. Linux内核的组织结构 二、Linux内核编译与配置 1. 获取Linux内核源码 2. 安装…...

C#WPF数据模板应用实例

一、数据模板定义 数据模板是一块定义如何显示绑定的数据对象的XAML标记。 有两种类型的控件支持数据模板: 1、内容控件 通过ContentTemplate属性支持数据模板。内容模板用于显示任何放置在Content属性中的内容。 2、列表控件(继承自ItemsControl类的控件) 通过ItemsTem…...

ansible练习题1

安装并配置ansible 在控制节点上安装并配置Ansible,要求如下: | 安装所需的软件包: 创建静态inventory文件/home/student/ansible/inventory ,要求如下: servera属于dev主机组 serverb属于test和balancers主机组 serverc和serverd属于prod主机组 …...

六大排序详讲(直接插入排序+希尔排序+选择排序+堆排序+冒泡排序+快速排序)

文章目录 排序一、 排序的概念1.排序&#xff1a;2.稳定性&#xff1a;3.内部排序&#xff1a;4.外部排序&#xff1a; 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四、交换排序1.冒泡排序2.快速排序…...

Clickhouse初认识

技术主题-clickhouse 一什么是clickHouse 1&#xff09;本质上就是一款数据库管理系统&#xff0c;能提供海量数据的存储和检索 2&#xff09;基于列存储&#xff0c;数据是按照列进行存储的&#xff08;数据格式一样&#xff0c;方便进行压缩&#xff09; 3&#xff09;具备…...

网络安全项目简介

安全项⽬ 基线检查 更改缺省的账户检查Guest用户是否禁用密码复杂性密码长度账户口令的生存期口令重复次数口令认证失败次数口令到期提示域成员禁用更改机器账户密码限制匿名用户连接共享账户检查远程关机授权是否开启默认文件共享每个用户是否遵循最小权限原则adminstrator账…...

CSDN每日一题学习训练——Python版(N皇后 II、买卖股票的最佳时机 II、编程通过键盘输入每一位运动员)

版本说明 当前版本号[20231120]。 版本修改说明20231120初版 目录 文章目录 版本说明目录N皇后 II题目解题思路代码思路参考代码 买卖股票的最佳时机 II题目解题思路代码思路参考代码 编程通过键盘输入每一位运动员题目解题思路代码思路参考代码 N皇后 II 题目 n 皇后问题…...

semodule工具详解(1)

本文内容参考&#xff1a; semodule(8) - Linux manual page https://linux.die.net/man/8/semodule 1. 介绍 名称 semoudule —— 管理SELinux策略模块。 简介 semodule [options]... MODE [MODES]... 描述 semodule是用于管理SELinux策略模块的工具&#xff0c;包括安装…...

用百度AI大模型给头像换风格

心血来潮想尝试尝试AI小应用&#xff0c;给图片加个风格&#xff08;例如微信头像&#xff09;&#xff0c;于是有了这篇简短的教程 目录 1. 领取免费资源2. 在应用列表创建应用3. 在线API调试4. 效果对比 1. 领取免费资源 网站&#xff1a;百度智能云 百度给提供了很多AIGC的…...

从入门到精通,mac电脑录屏软件使用教程!

“mac电脑怎么录屏呀&#xff0c;刚买了一台mac电脑&#xff0c;用了几个月感觉挺流畅的&#xff0c;最近因为工作原因&#xff0c;需要用到录屏功能&#xff0c;但是我不会操作&#xff0c;想问问大家有没有简单易懂的录屏教程&#xff0c;谢谢啦。” 在日常生活中&#xff0…...

Nginx(反向代理,负载均衡,动静分离)

反向代理 Nginx反向代理是一种将客户端请求转发给后端服务器的技术&#xff0c;即反向代理服务器。在这种架构中&#xff0c;客户端请求首先到达Nginx服务器&#xff0c;然后由Nginx服务器将请求转发给后端服务器&#xff0c;后端服务器响应请求&#xff0c;并将响应传递回Ngi…...

基于MCP协议与ReceiptConverter API的智能票据解析集成方案

1. 项目概述&#xff1a;让AI助手直接“看懂”你的票据 如果你和我一样&#xff0c;经常需要处理一堆杂乱的收据、发票&#xff0c;然后手动把里面的信息敲进Excel或者记账软件里&#xff0c;那你肯定知道这活儿有多烦人。一张张拍照、识别、核对金额、分类……效率低不说&…...

哔哩下载姬Downkyi:解锁B站视频下载的5个高效技巧

哔哩下载姬Downkyi&#xff1a;解锁B站视频下载的5个高效技巧 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff0…...

JavaScript驱动开源桌面机器人Stack-chan:从硬件选型到行为编程全解析

1. 项目概述&#xff1a;一个用JavaScript驱动的超可爱桌面机器人如果你和我一样&#xff0c;对桌面上的小玩意儿情有独钟&#xff0c;同时又是个喜欢折腾硬件的开发者&#xff0c;那么Stack-chan绝对会让你眼前一亮。它不是一个简单的摆件&#xff0c;而是一个完全开源的、由J…...

ASIC功能验证:基于规范的方法学与实践

1. ASIC功能验证的现状与挑战在当今的芯片设计领域&#xff0c;功能验证已成为整个开发流程中最耗时且资源密集的环节。根据行业统计数据&#xff0c;现代ASIC项目中验证工作占据了整个开发周期的50%-70%&#xff0c;而设计实现本身仅占较小比例。这种不平衡的资源分配直接反映…...

Linux awk 命令:文本处理的瑞士军刀

awk 是 Linux 下最强大的文本处理工具之一&#xff0c;名字取自三位创始人 Aho、Weinberger、Kernighan 的姓氏首字母。很多人只用它做简单的列提取&#xff0c;其实 awk 的能力远不止于此。 awk 的核心模型 awk 的工作流程可以概括为&#xff1a; awk pattern { action } f…...

Xbox成就解锁器完整指南:如何快速解锁Xbox游戏成就的免费工具

Xbox成就解锁器完整指南&#xff1a;如何快速解锁Xbox游戏成就的免费工具 【免费下载链接】Xbox-Achievement-Unlocker Achievement unlocker for xbox games (barely works but it does) 项目地址: https://gitcode.com/gh_mirrors/xb/Xbox-Achievement-Unlocker 还在为…...

基于MCP协议的AI智能体工具总线:mcp-router架构与实战指南

1. 项目概述&#xff1a;一个面向AI代理的“交通枢纽” 最近在折腾AI应用开发&#xff0c;特别是围绕OpenAI的Assistant API或者LangChain这类框架构建智能体&#xff08;Agent&#xff09;时&#xff0c;一个绕不开的痛点就是&#xff1a;如何让我的AI助手方便、安全地调用外…...

MouseTester终极指南:专业鼠标性能测试工具完全解析

MouseTester终极指南&#xff1a;专业鼠标性能测试工具完全解析 【免费下载链接】MouseTester 项目地址: https://gitcode.com/gh_mirrors/mo/MouseTester 想要精准评估你的鼠标性能表现吗&#xff1f;无论是游戏玩家追求极致的操作响应&#xff0c;还是设计师需要精准…...

Farcaster智能体框架实战:从事件驱动到社区助手构建

1. 项目概述&#xff1a;一个面向Farcaster生态的智能体框架最近在Web3社交领域&#xff0c;Farcaster生态的活跃度肉眼可见地增长。无论是原生应用Warpcast的火爆&#xff0c;还是各种第三方客户端和机器人的涌现&#xff0c;都预示着这里正在成为一个新的开发者乐园。在这个背…...

从人本到社本:构建ChatGPT社会影响评估与伦理治理新范式

1. 项目概述&#xff1a;当AI对话成为社会基础设施“从人本到社本”&#xff0c;这个标题精准地捕捉了我们这个时代AI伦理讨论的焦点转移。几年前&#xff0c;当GPT-3刚问世时&#xff0c;我们还在惊叹于它如何“理解”人类语言&#xff0c;讨论的重点是它会不会取代我的工作、…...