在学习安全传输平台项目总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

10-安全传输平台项目-第08天(密钥协商设计与实现--存数据库-mfc项目创建)

目录:
一、复习
二、安全传输平台项目——密钥协商设计与实现--存数据库-MFC项目创建
1、密钥协商存数据库
2、表外键约束导致的插入时间错误
3、密钥注销流程分析
4、4大基础组件源码
5、数据库连接池错误说明
6、配置ODBC驱动
7、ODBC驱动错误说明
8、界面框架思想
9、MFC空项目创建
10、处理源码中cur图标对应错误
11、添加消息宏定义

 

一、复习

1、数据库-SQL语句、事务、游标回顾
2、数据库-访问API、查询语句API、非查询语句API
3、数据库-base64编码

 

二、安全传输平台项目——密钥协商设计与实现--存数据库-MFC项目创建

1、密钥协商存数据库

icdbapi.h和keymng_dbop.h放入inc目录下;keymng_dbop.c放入src目录下。

>vi keymngserverop.c

1)增加头文件icdbapi.h和keymng_dbop.h;

2)MngServer_InitInfo函数增加-初始化数据库连接池IC_DBApi_PoolInit函数;

3)MngServer_Agree函数增加-写数据库KeyMngsvr_DBOp_WriteSecKey函数;

4)MngServer_Agree函数增加-获取一条数据库连接池中的连接IC_DBApi_ConnGet函数;

5)MngServer_Agree函数增加-从数据库中获取 seckeyid的 KeyMngsvr_DBOp_GenKeyID函数;

6)MngServer_Agree函数增加-开启事务的 IC_DBApi_BeginTran函数和关闭事务的iIC_DBApi_Rollback函数;

7)MngServer_Agree函数增加-释放数据库连接到连接池IC_DBApi_ConnFree函数;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "keymngserverop.h"
#include "keymng_msg.h"
#include "keymnglog.h" 
#include "keymng_shmop.h"
#include "icdbapi.h"
#include "keymng_dbop.h"

//static int    seckeyid = 100;

int MngServer_InitInfo(MngServer_Info *svrInfo)
{
    int ret = 0;
    strcpy(svrInfo->serverId, "0001");
    strcpy(svrInfo->dbuse, "SECMNG");
    strcpy(svrInfo->dbpasswd, "SECMNG");
    strcpy(svrInfo->dbsid, "orcl");
    svrInfo->dbpoolnum = 8;    
    strcpy(svrInfo->serverip, "127.0.0.1");
    svrInfo->serverport = 8001;
    svrInfo->maxnode = 10;
    svrInfo->shmkey = 0x0001;
    svrInfo->shmhdl = 0;
    
    //创建/打开 共享内存
    ret = KeyMng_ShmInit(svrInfo->shmkey, svrInfo->maxnode, &svrInfo->shmhdl);
    if (ret != 0) {
        printf("---------服务器创建/打开 共享内存失败-----\n");
        KeyMng_Log(__FILE__, __LINE__, KeyMngLevel[4], ret, "服务器 KeyMng_ShmInit() err:%d", ret);
        return ret;
    }
    
    //初始化数据库连接池
    ret = IC_DBApi_PoolInit(svrInfo->dbpoolnum, svrInfo->dbsid, svrInfo->dbuse, svrInfo->dbpasswd);
    if (ret != 0) {
        printf("---------服务器初始化连接池失败-----\n");
        KeyMng_Log(__FILE__, __LINE__, KeyMngLevel[4], ret, "服务器 IC_DBApi_PoolInit() err:%d", ret);
        return ret;
    }
    
    return 0;    
}

int MngServer_Agree(MngServer_Info *svrInfo, MsgKey_Req *msgkeyReq, unsigned char **outData, int *datalen)
{
    int ret = 0;
    int i = 0;
    int keyid = -1;
    
    MsgKey_Res msgKey_Res;
    
    NodeSHMInfo nodeSHMInfo;
    
    ICDBHandle handle = NULL;
    
    // --结合 r1 r2 生成密钥  ---> 成功、失败 rv
    if (strcmp(svrInfo->serverId, msgkeyReq->serverId) != 0) {
        KeyMng_Log(__FILE__, __LINE__, KeyMngLevel[4], ret, "客户端访问了错误的服务器");
        return -1;    
    }
    
    // 组织 应答结构体 res : rv r2 clientId serverId  seckeyid
    msgKey_Res.rv = 0;     //0 成功 1 失败。
    strcpy(msgKey_Res.clientId, msgkeyReq->clientId); 
    strcpy(msgKey_Res.serverId, msgkeyReq->serverId); 
    
    // 生成随机数 r2
    for (i = 0; i < 64; i++) {
        msgKey_Res.r2[i] = 'a' + i;            
    }
    
    //获取一条数据库连接池中的连接
    ret = IC_DBApi_ConnGet(&handle, 0, 0);
    if (ret != 0) {
        KeyMng_Log(__FILE__, __LINE__, KeyMngLevel[4], ret, "服务器 IC_DBApi_ConnGet() err:%d", ret);    
        return ret;
    }
    
    //开启事务
    IC_DBApi_BeginTran(handle);
    
    //从数据库中获取 seckeyid
    //msgKey_Res.seckeyid = seckeyid++;
    ret = KeyMngsvr_DBOp_GenKeyID(handle, &keyid);
    if (ret != 0) {
        KeyMng_Log(__FILE__, __LINE__, KeyMngLevel[4], ret, "服务器 KeyMngsvr_DBOp_GenKeyID() err:%d", ret);
        return ret;    
    }
    msgKey_Res.seckeyid = keyid;
    
    // 组织密钥节点信息结构体
    for (i = 0; i < 64; i++) {
        nodeSHMInfo.seckey[2*i] = msgkeyReq->r1[i];
        nodeSHMInfo.seckey[2*i+1] = msgKey_Res.r2[i];
    }
    nodeSHMInfo.status = 0;  //0-有效 1无效
    strcpy(nodeSHMInfo.clientId, msgkeyReq->clientId);
    strcpy(nodeSHMInfo.serverId, msgkeyReq->serverId);
    nodeSHMInfo.seckeyid = msgKey_Res.seckeyid;
    
    // --写数据库
    ret = KeyMngsvr_DBOp_WriteSecKey(handle, &nodeSHMInfo); 
    if (ret != 0) {
        KeyMng_Log(__FILE__, __LINE__, KeyMngLevel[4], ret, "服务器 KeyMngsvr_DBOp_WriteSecKey() err:%d", ret);    
    }
    
    // 关闭事务
    if (ret != 0) {
        iIC_DBApi_Rollback(handle);
        IC_DBApi_ConnFree(handle, 0);//释放数据库连接到连接池
        return -1;
    }
    else if(ret == 0)
    {
        IC_DBApi_Commit(handle);
        IC_DBApi_ConnFree(handle, 1);//释放数据库连接到连接池
    }
    
    // --写入共享内存。
    ret = KeyMng_ShmWrite(svrInfo->shmhdl, svrInfo->maxnode, &nodeSHMInfo);
    if (ret != 0) {
        KeyMng_Log(__FILE__, __LINE__, KeyMngLevel[4], ret, "服务器 KeyMng_ShmWrite() err:%d", ret);
        return ret;    
    }
    
    // 编码应答报文  传出
    ret = MsgEncode(&msgKey_Res, ID_MsgKey_Res, outData, datalen);
    if (ret != 0) {
        KeyMng_Log(__FILE__, __LINE__, KeyMngLevel[4], ret, "serverAgree MsgEncode() err:%d", ret);    
        return ret;
    }
    
    return 0;    
}


int MngServer_Check(MngServer_Info *svrInfo, MsgKey_Req *msgkeyReq, unsigned char **outData, int *datalen)
{
    
    
    return 0;    
}
keymngserverop.c

相关文章:

  • 2021-12-19
  • 2021-08-11
  • 2022-12-23
  • 2022-01-10
  • 2022-01-15
  • 2021-11-06
  • 2021-12-09
  • 2021-07-03
猜你喜欢
  • 2021-12-16
  • 2021-09-27
  • 2021-10-10
  • 2022-02-27
  • 2021-12-14
  • 2021-11-15
相关资源
相似解决方案