Openssl数据安全传输平台019:外联接口类的封装以及动态库的制作 - Bug未解决,感觉不是代码的问题

文章目录

  • 1 外联接口
    • 1.1 接口类的封装
    • 1.2 共享内存与配置文件
  • 2 json格式配置文件的定义
    • 2.1 共享内存中存储的节点结构
    • 2.2 服务器端配置文件
    • 2.3 客户端配置文件
    • 2.4 改进配置文件
  • 3 共享内存类修改
  • 4 将接口打包成库(静态/动态)
    • 4.1 相关的指令
      • 4.1.1 静态库
      • 4.1.2 动态库
    • 4.2 外联接口的实现 - 以金融安全传输项目为例
      • 4.2.1 创建一个空Linux项目
      • 4.2.2 将封装好的类文件加入到项目中
      • 4.2.3 在属性页中添加库依赖项
      • 4.2.4 配置远程主机,启动调试,确认代码没有问题
      • 4.2.5 远程主机上删掉main.cpp或者test.cpp
      • 4.2.6 将剩余的cpp打包成动态库
  • 5 动态库的测试
    • 5.1 测试代码的仓库:
    • 5.1 先启动秘钥协商的客户端和服务端 ,并查看共享内存的状态
    • 5.2 测试用的客户端是好的,但是服务端没法跟共享内存关联。很奇怪,留一个bug...待解决

1 外联接口

1.1 接口类的封装

  // 读共享内存中的秘钥, 进行对称加密// des , 3des , aesclass MyInterface{public:// json参数磁盘的json格式的配置文件MyInterface(string json);~MyInterface();// 数据加密// 参数: 待加密的数据->明文, 返回值: 密文string encryptData_des(string str);string encryptData_3des(string str);string encryptData_aes(string str);// 数据解密// 参数: 待解密的数据-密文, 返回值: 明文string decryptData_des(string str);string decryptData_3des(string str);string decryptData_aes(string str);}

在这里插入图片描述

  • 可以参考这个项目的实现,将加解密封各自封装好

https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform/tree/dev_origin/Module%20Preparation%20and%20Test/07.CryptoTest

1.2 共享内存与配置文件

提供的接口不是一个应用程序 -> 不是进程

  • 如何从共享内存中读数据?
    • 虽然接口不是程序, 但是要被业务程序调用
      • 业务程序是进程
        • 通过业务程序完成进程间通信
  • 外联接口要求必须要通用
    • 必须用通过配置文件读配置信息 -> 找到共享内存

2 json格式配置文件的定义

2.1 共享内存中存储的节点结构

  class NodeSecKeyInfo{public:NodeSecKeyInfo() : status(0), seckeyID(0){bzero(clientID, sizeof(clientID));bzero(serverID, sizeof(serverID));bzero(seckey, sizeof(seckey));}int status;        // 秘钥状态: 1可用, 0:不可用int seckeyID;    // 秘钥的编号char clientID[12];    // 客户端ID, 客户端的标识char serverID[12];    // 服务器ID, 服务器标识char seckey[128];    // 对称加密的秘钥};

2.2 服务器端配置文件


{"ServerID":"0001",        // 当前秘钥协商服务器的ID"ClientID":"1111"        // 不能写死,和当前业务服务器通信的客户端ID --> 这个是动态的"ShmKey":"/usr/lib",    // 通过 shmKey 打开一块已经存在的共享内存"MaxNode":100,          // 共享内存中存储的最大节点数 -> 用于遍历
}

2.3 客户端配置文件

{"ServerID":"0001","ClientID":"1111""shmKey":"/usr/local",    // 通过 shmKey 打开一块已经存在的共享内存"MaxNode":1,            // 共享内存中存储的最大节点数 -> 用于遍历
}

2.4 改进配置文件

// 将配置文件中的serverID和clientID去掉
// 找秘钥的方式:- 通过clientID和serverID进行查找- 通过秘钥ID查找// 通过配置文件打开共享内存
{"shmKey":"/usr/local",    // 通过 shmKey 打开一块已经存在的共享内存"MaxNode":1,            // 共享内存中存储的最大节点数 -> 用于遍历
}

3 共享内存类修改

class SecKeyShm : public BaseShm
{
public:// 打开或创建一块共享内存// 这个操作是在父类中做的SecKeyShm(int key, int maxNode);SecKeyShm(string pathName, int maxNode);~SecKeyShm();void shmInit();int shmWrite(NodeSecKeyInfo* pNodeInfo);NodeSecKeyInfo shmRead(string clientID, string serverID);/**********************************************/NodeSecKeyInfo shmRead(int keyID);// 通过这个函数读共享内存中的第一个NodeSecKeyInfo// 给客户端使用// 这个不会NodeSecKeyInfo shmFirstNode();private:int m_maxNode;
};
NodeSecKeyInfo SecKeyShm::shmRead(int keyID)
{int ret = 0;// 关联共享内存NodeSecKeyInfo* pAddr = NULL;pAddr = static_cast<NodeSecKeyInfo*>(mapShm());if (pAddr == NULL){cout << "共享内存关联失败..." << endl;return NodeSecKeyInfo();}cout << "共享内存关联成功..." << endl;//遍历网点信息int i = 0;NodeSecKeyInfo info;NodeSecKeyInfo* pNode = NULL;// 通过clientID和serverID查找节点cout << "maxNode: " << m_maxNode << endl;for (i = 0; i < m_maxNode; i++){pNode = pAddr + i;cout << i << endl;cout << "keyID: " <<keyID << endl;//cout << "clientID 比较: " << pNode->clientID << ", " << clientID.data() << endl;//cout << "serverID 比较: " << pNode->serverID << ", " << serverID.data() << endl;if (pNode->seckeyID == keyID){// 找到的节点信息, 拷贝到传出参数info = *pNode;cout << "++++++++++++++" << endl;cout << info.clientID << " , " << info.serverID << ", "<< info.seckeyID << ", " << info.status << ", "<< info.seckey << endl;cout << "===============" << endl;break;}}unmapShm();return info;
}

4 将接口打包成库(静态/动态)

4.1 相关的指令

4.1.1 静态库

// 生成.o
gcc/g++ *.c/*.cpp -c// 打包.o
ar rcs libxxx.a  *.o

4.1.2 动态库

# 生成.o -> 和位置无关使用的是相对地址
gcc/g++ *.c/*.cpp -c -fpic
# 生成动态库
gcc/g++ -shared *.o -o libxxx.so

4.2 外联接口的实现 - 以金融安全传输项目为例

打包加解密的库

4.2.1 创建一个空Linux项目

4.2.2 将封装好的类文件加入到项目中

在这里插入图片描述

4.2.3 在属性页中添加库依赖项

这里要注意jsoncpp的写法,

如果centos里json动态库的名字是libjson.so,那么就是写json.

因为我在安装json的时候创建软连接的名字是libjsoncpp.so,因此这里写的jsoncpp

jsoncpp;crypto

在这里插入图片描述

4.2.4 配置远程主机,启动调试,确认代码没有问题

在这里插入图片描述
在这里插入图片描述

4.2.5 远程主机上删掉main.cpp或者test.cpp

在这里插入图片描述

4.2.6 将剩余的cpp打包成动态库

g++ -c *.cpp -std=c++11 -fpic

在这里插入图片描述

g++ -shared *.o -o libinterface.so 

在这里插入图片描述
将头文件里的API和libxxx.so文件发给用户就可以了。

5 动态库的测试

5.1 测试代码的仓库:

在第4部分,打包的动态库所在的位置为:/root/projects/Interface
mv libinterface.so /usr/lib/
在这里插入图片描述

  • 编译指令
g++ *.cpp   -lpthread -L/root/projects/Interface -linterface -ljsoncpp -lcrypto   -std=c++11g++ *.cpp -lpthread -linterface -ljsoncpp -lcrypto -std=c++11

5.1 先启动秘钥协商的客户端和服务端 ,并查看共享内存的状态

在这里插入图片描述在这里插入图片描述

5.2 测试用的客户端是好的,但是服务端没法跟共享内存关联。很奇怪,留一个bug…待解决

在这里插入图片描述

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

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

相关文章

docker compose实现容器编排

Compose 使用的三个步骤&#xff1a; 使用 Dockerfile 定义应用程序的环境 使用 compose.yml 定义构成应用程序的服务&#xff0c;这样它们可以在隔离环境中一起运行 最后&#xff0c;执行 docker compose up 命令来启动并运行整个应用程序 为什么需要docker compose Dock…

Istio 实战

文章目录 Istio流量管理分享会【1】什么是istio?【2】istio 可以干什么?【3】业务中的痛点?【4】istio 高级流量管理5.1 istio 组件介绍与原理5.2 sidercar何时注入?如何控制是否注入?5.3 查看sidecar 容器插入的容器中的iptablesDestination RuleVirtual ServiceGateways…

Go语言集成开发环境(IDE):GoLand 2023中文

GoLand 2023是一款由JetBrains开发的现代化、功能丰富的Go语言集成开发环境&#xff08;IDE&#xff09;。它提供了智能代码提示和自动完成、强大的内置调试器以及代码重构工具&#xff0c;帮助开发者提高编码效率并确保代码质量。GoLand 2023还支持多种版本控制系统&#xff0…

力扣:有效的括号

自己编写的代码 。 自己的思路&#xff1a; class Solution { private:unordered_map<char,int>symbolValues{{(,1},{),2},{{,4},{},5},{[,8},{],9}, };public:bool isValid(string s) {bool flagfalse;int lenss.length();if (lens % 2 ! 0){flag false;}for…

【深度学习基础】专业术语汇总(欠拟合和过拟合、泛化能力与迁移学习、调参和超参数、训练集、测试集和验证集)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

stm32 DMA

目录 简介 框图 DMA请求 DMA通道 DMA优先级 DMA 数据 外设到存储器 存储器到外设 存储器到存储器 传多少&#xff0c;单位是什么 传输完成 hal库代码 标准库代码 简介 CPU根据代码内容执行指令&#xff0c;这些众多指令中&#xff0c;有的用于计算、有的用于控制程…

YOLO算法改进6【中阶改进篇】:depthwise separable convolution轻量化C3

常规卷积操作 对于一张55像素、三通道&#xff08;shape为553&#xff09;&#xff0c;经过33卷积核的卷积层&#xff08;假设输出通道数为4&#xff0c;则卷积核shape为3334&#xff0c;最终输出4个Feature Map&#xff0c;如果有same padding则尺寸与输入层相同&#xff08;…

基于LDA主题+协同过滤+矩阵分解算法的智能电影推荐系统——机器学习算法应用(含python、JavaScript工程源码)+MovieLens数据集(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据爬取及处理2. 模型训练及保存1&#xff09;协同过滤2&#xff09;矩阵分解3&#xff09;LDA主题模型 3. 接口实现1&#xff09;流行电影推荐2&#xff09;相邻用户推荐3&#xff09;相似内容推荐 相关其它博…

黑马程序员项目-黑马点评

黑马点评1 短信登录 基于Session实现登录流程 发送验证码&#xff1a; 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff0c;如果不合法&#xff0c;则要求用户重新输入手机号 如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行…

KaiwuDB 内核解析 - SQL 查询的生命周期

一、概述 KaiwuDB 内核解析系列共分上下两部分&#xff0c;本文是该系列的第一部分&#xff0c;主要涵盖了网络协议到 SQL 执行器&#xff0c;解释 KaiwuDB 如何执行 SQL 查询&#xff0c;包括系统各个组件的执行路径&#xff08;网络协议、SQL 会话管理、解析器、执行计划及优…

服务器数据恢复—Zfs文件系统下文件被误删除的如何恢复数据?

服务器故障&#xff1a; 一台zfs文件系统服务器&#xff0c;管理员误操作删除服务器上的数据。 服务器数据恢复过程&#xff1a; 1、将故障服务器所有磁盘编号后取出&#xff0c;硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做扇区级别的镜像备…

单链表基本操作的实现,初始化,头插,尾插,判空,获取个数,查找,删除,获取前置和后置位,清空,销毁

目录 一.单链表的设计 二.单链表的实现 三.单链表的总结 一.单链表的设计 1.单链表的结构定义: typedef struct Node{int data;//数据域struct Node* next;//后继指针}Node,*List; 2.单链表的设计示意图: 3.注意,单链表的最后一个节点的next域为NULL; 4.为什么要有一个头…