码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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 , aes
      class 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);
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

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

    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];    // 对称加密的秘钥
      };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.2 服务器端配置文件

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

    2.3 客户端配置文件

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

    2.4 改进配置文件

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

    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;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

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

    4.1 相关的指令

    4.1.1 静态库

    // 生成.o
    gcc/g++ *.c/*.cpp -c
    
    // 打包.o
    ar rcs libxxx.a  *.o
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.1.2 动态库

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

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

    打包加解密的库

    4.2.1 创建一个空Linux项目

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

    在这里插入图片描述

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

    这里要注意jsoncpp的写法,

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

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

    jsoncpp;crypto
    
    • 1

    在这里插入图片描述

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

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

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

    在这里插入图片描述

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

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

    在这里插入图片描述

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

    在这里插入图片描述
    将头文件里的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++11
    
    
    g++ *.cpp -lpthread -linterface -ljsoncpp -lcrypto -std=c++11
    
    • 1
    • 2
    • 3
    • 4

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

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

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

    在这里插入图片描述

  • 相关阅读:
    应用地球物理+AI:智能地球勘探
    Python 多重继承时metaclass conflict问题解决与原理探究
    关于论青少年尽早学少儿编程之说
    Linux常用命令(下).
    【云享·人物】华为云AI高级专家白小龙:AI如何释放应用生产力,向AI工程化前行?
    C++ 内存模型 write_x_read_y 试例构造
    Git版本控制管理——diff
    知识图谱现学现用(Django 2.2 + Neo4j 3.5)
    SpringbootWeb快速入门
    【计算机视觉】CVPR 23 | 视觉 Transformer 全新学习范式!用长尾数据提升ViT性能
  • 原文地址:https://blog.csdn.net/jiangchufeng123/article/details/134156430
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号