[ 加密 ] 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Selenium自动化测试 —— 通过cookie绕过验证码的操作!

验证码的处理   对于web应用&#xff0c;很多地方比如登录、发帖都需要输入验证码&#xff0c;类型也多种多样&#xff1b;登录/核心操作过程中&#xff0c;系统会产生随机的验证码图片&#xff0c;进行验证才能进行后续操作 解决验证码的方法如下&#xff1a; 1、开发做个…

metersphere 创建场景, 自动动态变换参数值,实现接口自动化测试。

创建场景 创建产品变量 添加数值 添加后点击确定 点击右下角 号 点击 循环控制器 写循环 创建/导入接口 选择运行环境&#xff0c; 没有的话新建一个 需要点击引用环境 保存后点击 调试 成功做到每次请求的参数是列表里的 10

北邮22级信通院数电:Verilog-FPGA(10)第十周实验 实现移位寄存器74LS595(仿真方法验证)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 使用FPGA开发板验证的教程&#xff0c;请参考 北邮…

【蓝桥杯省赛真题44】Scratch像素画板 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

scratch像素画板 第十四届青少年蓝桥杯scratch编程省赛真题 一、题目要求 编程实现 1.点击绿旗,角色、背景如图所示(三种颜色调色盘、清除图标及方格角色请自行创建,点击绿旗后立刻呈现下图效果); 2.用鼠标点击红色调色盘,红色调色盘变为选中状态(如下图所示),此时鼠…

不夸张地说,这是我见过最通俗易懂的,pytest入门基础教程!

Pytest简介 Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. 通过官方网站介绍…

树与二叉树堆:堆

堆的概念&#xff1a; 一般是把数组的数据在逻辑结构上看成一颗完全二叉树&#xff0c;如下图所示。 注意&#xff1a;别将C语言中的堆和数据结构的堆混为一谈&#xff0c;本文所讲的数据结构的堆是一种完全二叉树&#xff0c;而C语言中的堆其实是一种内存区域的划分 堆的分类…

【链表的说明、方法---顺序表与链表的区别】

文章目录 前言什么是链表链表的结构带头和不带头的区别 链表的实现&#xff08;方法&#xff09;遍历链表头插法尾插法任意位置插入一个节点链表中是否包含某个数字删除链表某个节点删除链表中所有关键字key清空链表所有节点 ArrayList 和 LinkedList的区别总结 前言 什么是链…

【Ubuntu】Ubuntu arm64 部署 Blazor Server 应用

部署步骤 发布安装运行环境&#xff1a;dotnet-sdk&#xff08;必装&#xff09;、aspnetcore-runtime、dotnet-runtime安装证书设置环境变量&#xff1a;临时变量、当前用户永久变量、所有用户的永久变量运行&#xff1a;终端运行、后台运行 基本情况 开发系统环境 系统&am…

RabbitMQ消息队列快速入门

RabbitMQ消息队列快速入门 初始MQ MQ全称为Message Queue&#xff0c;即消息队列&#xff0c;是在消息的传输过程中保存消息的容器。它是典型的生产者-消费者模型。 生产者不断向消息队列中生产消息&#xff0c;消费者不断的从队列中获取消息。消息的生产和消费都是异步的&am…

SQL DELETE 语句:删除表中记录的语法和示例,以及 SQL SELECT TOP、LIMIT、FETCH FIRST 或 ROWNUM 子句的使用

SQL DELETE 语句 SQL DELETE 语句用于删除表中的现有记录。 DELETE 语法 DELETE FROM 表名 WHERE 条件;注意&#xff1a;在删除表中的记录时要小心&#xff01;请注意DELETE语句中的WHERE子句。WHERE子句指定应删除哪些记录。如果省略WHERE子句&#xff0c;将会删除表中的所…

战备器材管理系统-部队物资仓库管理系统

一、项目背景 传统的战备物资管理&#xff0c;一般依赖于一个非自动化的、以纸张文件为基础的系统来记录、追踪进出的货物&#xff0c;完全由人工实施仓库内部的管理&#xff0c;因此仓库管理的效率极其低下。对此&#xff0c;我们运用无线射频技术(RFID)的仓库智能管理系统&am…

Fiddler抓包看这篇就够了:fiddler设置弱网测试

弱网测试 概念&#xff1a;弱网看字面意思就是网络比较弱&#xff0c;我们通称为信号差&#xff0c;网速慢。 意义&#xff1a;模拟在地铁、隧道、电梯和车库等场景下使用APP &#xff0c;网络会出现延时、中断和超时等情况。 自动化测试相关教程推荐&#xff1a; 2023最新自…

基于单片机加热炉多参数检测和PID炉温系统

**单片机设计介绍&#xff0c; 基于单片机加热炉多参数检测和PID炉温系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的公交安全预警系统可以被设计成能够实时监测公交车辆的行驶状态&#xff0c;并在发生异常情况…

金蝶云星空套打设计

文章目录 金蝶云星空套打设计下载登录打开需要创建套打的单据新建套打模板数据中心-发货通知单-设置预览 金蝶云星空套打设计 下载 登录 打开需要创建套打的单据 KD开头&#xff0c;是标准产品预设。 新建套打模板 默认A4纸 默认插入三行三列。 拖入文本&#xff0c;填写内容…

计算机基础知识54

ORM的介绍 # ORM是什么&#xff1f; 我们在使用Django框架开发web应用的过程中&#xff0c;不可避免地会涉及到数据的管理操作&#xff08;增、删、改、查&#xff09;&#xff0c;而一旦谈到数据的管理操作&#xff0c;就需要用到数据库管理软件&#xff0c;例如mysql、oracle…

map的基础定义及运用

Map 1 使用 1 声明 /*声明map*/map<int, string> myMap {{1, "Apple"}, {2, "Banana"}, {3, "Orange"}};2 插入元素 myMap.insert(make_pair(4, "Graphes"));3 通过访问键查找和访问元素 cout << myMap[2] <<…

Ubuntu Server download

前言 Ubuntu——公共云、数据中心和边缘上最受欢迎的 Linux 发行版。自成立以来&#xff0c;Ubuntu 一直在获得市场份额&#xff0c;截至今天已接近 50%。 Ubuntu Server download VersionUbuntu Server 其它主机型号版本Ubuntu AMD历史版下载百度云Ubuntu Server all Ubuntu…

小白也能看懂的国内外 AI 芯片概述

随着越来越多的企业将人工智能应用于其产品&#xff0c;AI芯片需求快速增长&#xff0c;市场规模增长显著。因此&#xff0c;本文主要针对目前市场上的AI芯片厂商及其产品进行简要概述。 简介 AI芯片也被称为AI加速器或计算卡&#xff0c;从广义上讲只要能够运行人工智能算法…

本机idea连接虚拟机中的Hbase

相关环境&#xff1a; 虚拟机&#xff1a;Centos7 hadoop版本:3.1.3 hbase版本:2.4.11 zookeeper版本:3.5.7 Java IDE:IDEA JDK&#xff1a;8 步骤 步骤一&#xff1a;在idea创建一个maven项目 步骤二&#xff1a;在虚拟机里找到core-site.x…

【C++】map multimap

文章目录 1.map介绍2.map的使用3.multimap介绍4.multimap的使用 1.map介绍 map的文档 翻译&#xff1a; map是关联容器&#xff0c;它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。 在map中&#xff0c;键值key通常用于排序和惟一地标识元素&#x…