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…待解决

相关文章:
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 外联接…...
YOLO目标检测——安全帽佩戴检测数据集【含对应voc、coco和yolo三种格式标签】
实际项目应用:安全帽佩戴检测数据集可以用于实时检测工作人员是否按照要求佩戴了安全帽,以保障他们的安全数据集说明:安全帽佩戴检测数据集,真实场景的高质量图片数据,数据场景丰富,图片分为带头盔和没带头…...
P4345 [SHOI2015] 超能粒子炮·改 题解---------Lucas定理
题面: 题目 题意概括: T T T 次询问,每次给出 n , k n,k n,k,求 ∑ i 0 k C n i % 2333 \sum_{i 0}^{k} C_{n}^{i} \ \% \ 2333 ∑i0kCni % 2333。 1 ≤ T ≤ 1 0 5 , 1 ≤ n , k ≤ 1 0 18 1\leq T \leq10^5…...
http代理和ip代理的区别,代理IP带来了哪些好处?
随着互联网的快速发展,代理IP和HTTP代理已成为网络爬虫、网络营销、数据抓取等领域中不可或缺的一部分。但是,很多人在使用代理IP和HTTP代理时并不清楚两者的区别,以及代理IP所带来的好处。本文将详细介绍这两者之间的差异,以及代…...
浅谈电动汽车充电桩检测技术的实现
叶根胜 安科瑞电气股份有限公司 上海嘉定 201801 摘要: 关键词:电动直流和交流充电桩是我国电动汽车充电桩中运行量较大的一种。为了保持正常运行和使用,应高度重视检测、运行和维护工作。因此,有关部门应做好充电桩的检测工作…...
20 分钟搭建一个串流服务器
步骤1:准备Nginx RTMP容器 首先,您可以使用官方的Nginx RTMP Docker镜像来创建Nginx RTMP容器。运行以下命令: docker run -d -p 1935:1935 --name nginx-rtmp tiangolo/nginx-rtmp 这将在后台运行Nginx RTMP容器,将本地1935端…...
Android ActivityLifecycleCallback使用
在 Android 开发中,ActivityLifecycleCallbacks 是一个接口,用于监听和管理应用程序中 Activity 的生命周期事件。通过实现 ActivityLifecycleCallbacks 接口,可以在 Activity 的创建、启动、暂停、恢复、停止和销毁等各个阶段执行相应的操作…...
力扣labuladong——一刷day14
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣21. 合并两个有序链表二、力扣86. 分隔链表三、力扣23. 合并 K 个升序链表四、力扣19. 删除链表的倒数第 N 个结点五、力扣876. 链表的中间结点六、力扣…...
循环神经网络(RNN)与长短期记忆网络(LSTM)
前言: 通过前面的学习,我们以BP神经网络为基础,认识到了损失函数,激活函数,以及梯度下降法的原理;而后学习了卷积神经网络,知道图像识别是如何实现的。今天这篇文章,讲述的就是计算机…...
ArxDbgDocLockWrite 类简介
ArxDbgDocLockWrite 类是一个用于在 AutoCAD 中锁定文档的自定义类。它提供了一些方法来获取和释放对文档的写入锁定,并且还可以设置当前文档。 该类的原理如下: 构造函数 ArxDbgDocLockWrite() 和 ArxDbgDocLockWrite(AcDbDatabase* db) 用于创建 Arx…...
【教3妹学编辑-算法题】环和杆
3妹:2哥,今年春节的放假安排出来了,今年春节放8天假,我们公司除夕提前放一天,总共9天假。 耶~~~ 2哥 :你们公司这么好啊, 我们公司的放假安排还没出来,不知道今年除夕能不能回家了… 3妹&#x…...
解决 eslint 的 Parsing error: Unexpected token 错误
解决 eslint 的 Parsing error: Unexpected token 错误 问题描述:import动态导入,将js文件单独打包时,webpack打包错误 ERROR in ./src/js/main.js Module Error (from ./node_modules/_eslint-loader4.0.2eslint-loader/dist/cjs.js ): F…...
VR全景技术在文化展示与传播中有哪些应用?
引言: 随着科技的不断进步,虚拟现实(VR)全景技术已经成为文化展示与传播领域的一项重要工具。那么VR全景技术是如何改变文化展示与传播方式,VR全景技术又如何推动文化的传承和普及呢? 一.VR技术…...
Linux shell编程学习笔记19:until循环语句
Linux shell编程中的until语句,在功能上与其它编程语言一致,但在结构与其它编程语言又不太一样。在大多数编程语言中,until语句的循环条件表达式一般位于循环体语句的后面,但是在Linux shell编程中,until语句的循环条件…...
(CV)论文列表
CNN卷积神经网络之SKNet及代码 https://blog.csdn.net/qq_41917697/article/details/122791002 【CVPR2022 oral】MixFormer: Mixing Features across Windows and Dimensions 【精选】【CVPR2022 oral】MixFormer: Mixing Features across Windows and Dimensions-CSDN博客...
恶意软件防范和拦截: 提供防范恶意软件攻击的策略
恶意软件,或者俗称的“病毒”,一直是IT领域的一个严重威胁。这些恶意软件可以窃取敏感信息、损害系统稳定性,甚至对企业和个人造成重大经济损失。在这篇博客文章中,我们将讨论如何防范和拦截恶意软件攻击,包括使用反病…...
单例模式浅析
程序中仅存在一个对象实例,避免重复构建浪费资源。 1.饿汉式 主要分为3步:1.构造方法私有化 2.内部创建静态实例化对象 3.提供公有静态方法,返回对象实例 public class SingleTon { // 构造方法私有化private SingleTon(){} // 内部…...
Springboot引入mybatis-plus及操作mysql的json字段
springboot引入mybatis-plus,创建springboot项目省略 pom文件 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.4</version></dependency> <!…...
springboot读取application.properties中文乱码问题
目录 1 前言: 2 本地环境中的解决方案(以idea为例) 3 全部解决方案 1 前言: 初用properties,读取java properties文件的时候如果value是中文,会出现乱码的问题。我们首先需要明了乱码问题的根源。在 Java 中&#x…...
SAML- 安全断言标记语言
一、概念 安全断言标记语言(SAML)是一种开放标准,用于在各方之间(特别是身份提供商和服务提供商之间)交换身份验证和授权数据。SAML 是一种基于XML的安全断言标记语言(服务提供商用来做出访问控制决策的语句…...
Play Integrity API Checker:构建企业级Android安全防御体系的技术架构与商业价值
Play Integrity API Checker:构建企业级Android安全防御体系的技术架构与商业价值 【免费下载链接】play-integrity-checker-app Get info about your Device Integrity through the Play Intergrity API 项目地址: https://gitcode.com/gh_mirrors/pl/play-integ…...
3步解锁专业中文Figma设计环境:告别语言障碍的设计革命
3步解锁专业中文Figma设计环境:告别语言障碍的设计革命 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而烦恼吗?每次设计时都要在"F…...
用Python+Mediapipe+OpenCV做个手势识别小游戏(附完整源码和避坑指南)
用PythonMediapipeOpenCV打造手势控制太空射击游戏 最近在整理旧项目时,翻出一个用Mediapipe手势识别控制的小游戏原型。这个太空射击游戏完全通过手势操作——食指瞄准,握拳射击,手掌移动控制飞船位置。当时为了调试手势映射逻辑,…...
再论观点“C++是否应避免使用普通指针,而使用智能指针(包括shared,unique,weak)”
再论观点“C是否应避免使用普通指针,而使用智能指针(包括shared,unique,weak)” PS:笔者这次投稿的问题是:https://www.zhihu.com/question/319277442。老规矩,顺手投稿的问题&…...
范畴论与拓扑数据分析:统一聚类算法与捕捉数据形状的新范式
1. 项目概述:当聚类算法遇见范畴论与拓扑如果你在数据科学或机器学习领域摸爬滚打了一段时间,大概率对K-Means、DBSCAN、层次聚类这些名字已经烂熟于心。我们习惯于将它们视为一系列精妙的“算法黑箱”:输入数据点,调整几个超参数…...
转行要趁早!网络安全行业人才缺口大,企业招聘需求正旺
网络安全行业具有人才缺口大、岗位选择多、薪资待遇好、学历要求不高等优势,对于想要转行的人员来说,是一个非常不错的选择。 人才缺口大 网络安全攻防技术手段日新月异,特别是现在人工智能技术飞速发展,网络安全形势复杂严峻&am…...
NVIDIA Profile Inspector终极指南:解锁显卡隐藏功能,5步优化游戏性能
NVIDIA Profile Inspector终极指南:解锁显卡隐藏功能,5步优化游戏性能 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否经常觉得游戏画面不够流畅?或者发现显卡…...
量子机器学习中的偏见:从编码到测量的系统性挑战与缓解策略
1. 量子机器学习中的偏见:一个被忽视的工程挑战量子机器学习(QML)正从理论实验室走向现实应用,从药物分子筛选到金融衍生品定价,其潜力令人兴奋。然而,作为一名长期关注量子算法落地的从业者,我…...
量子机器学习在基因组分类中的实践:特征映射与模型选择指南
1. 项目概述:当量子计算遇上基因组学如果你和我一样,既对量子计算的神秘力量感到好奇,又长期在生物信息学的数据海洋里“游泳”,那么“量子机器学习”这个交叉领域绝对值得你投入时间。这听起来像是科幻小说的情节,但现…...
机器学习赋能系统综述:SyROCCo项目实战解析与NLP应用指南
1. 项目概述:当系统综述遇上机器学习如果你做过系统综述,一定对那种“望洋兴叹”的感觉不陌生。面对动辄成千上万的文献,光是筛选、阅读、提取数据这几步,就足以耗掉一个团队数月甚至数年的精力。更头疼的是,等你终于完…...
