This commit is contained in:
blue-lemon0104
2026-04-07 13:35:22 +08:00
commit 0120fa9ce3
1530 changed files with 424864 additions and 0 deletions

View File

@@ -0,0 +1,255 @@
// db_interface.hpp
#ifndef DB_INTERFACE_HPP
#define DB_INTERFACE_HPP
#ifdef __cplusplus
extern "C"
{
#endif
#include "postgres.h" // 与 #include <iomanip> 冲突
//为了解决和libintl.h冲突的问题undef以下4个
#undef gettext
#undef dgettext
#undef ngettext
#undef dngettext
#include "utils/palloc.h"
#include "utils/memutils.h"
#include "nodes/nodes.h"
#include "nodes/parsenodes.h"
#include "nodes/value.h"
#include "base64.h"
#include <string.h>
#ifdef __cplusplus
}
#endif
#include "encryptsql/fieldmap.h"
#include <assert.h>
#include <stdexcept>
#include <set>
#include <vector>
#include <string>
#include "libpq-fe.h" // 改为使用引号包含
#include "crypto/crypto.h"
#include "crypto/openssl.h"
#include "encryptsql.h"
// 因为缺头文件所以直接复制过来了,肯定有很多用不上的
#include <regex>
#include <iostream>
#include <unordered_set>
#include <string>
#include <unordered_map>
#include "json.hpp"
#include "kms/kms_common.hpp"
#include "dek_manager.hpp"
// 数据库连接信息
#define DB_CONNINFO "dbname=dekmaster user=dekmaster password=secure_password hostaddr=127.0.0.1 port=5432"
#define BACKUP_TABLE_NAME "dek_store_backup"
#define ORIGINAL_TABLE_NAME "dek_store"
namespace DekInterface {
// 获取当前线程的 DBAdapter 实例
inline DekManager& getAdapter() {
return DekManager::getInstance();
}
// 初始化接口
inline void initialize(const std::string& user_name, const std::string& db_name) {
getAdapter().initialize(user_name, db_name);
}
// DEK 管理接口
// inline bool storeDek(const DEK& dek) {
// return getAdapter().storeDek(dek);
// }
// inline bool deleteDek(const std::string& user_name, const std::string& table, const std::string& column) {
// return getAdapter().deleteDek(user_name, table, column);
// }
// inline bool createDek(std::string& col_dek, const std::string& column_name) {
// return getAdapter().createDek(col_dek, column_name);
// }
// 数据库信息设置接口
inline void setInfoUser(const std::string& user_name) {
getAdapter().setInfoUser(user_name);
}
inline void setInfoDb(const std::string& db_name) {
getAdapter().setInfoDb(db_name);
}
inline void setInfoTable(const std::string& table_name) {
getAdapter().setInfoTable(table_name);
}
inline void setInfoCol(const std::string& col_name) {
getAdapter().setInfoCol(col_name);
}
// 数据库信息获取接口
inline std::string getInfoUser() {
return getAdapter().getInfoUser();
}
inline std::string getInfoDb() {
return getAdapter().getInfoDb();
}
inline std::string getInfoTable() {
return getAdapter().getInfoTable();
}
inline std::string getInfoCol() {
return getAdapter().getInfoCol();
}
// DEK 缓存管理接口
inline void setDekColLevel(const std::string& col_name, const std::string& dek_tmp) {
getAdapter().setDekColLevel(col_name, dek_tmp);
}
inline void getDekColLevel(const std::string& col_name, std::string& dek_tmp) {
getAdapter().getDekColLevel(col_name, dek_tmp);
}
inline void setDekTableLevel(const std::string& dek) {
getAdapter().setDekTableLevel(dek);
}
inline void getDekTableLevel(std::string& dek) {
getAdapter().getDekTableLevel(dek);
}
inline void setDekTableLevelForUpdate(const std::string& dek) {
getAdapter().setDekTableLevelForUpdate(dek);
}
inline void getDekTableLevelForUpdate(std::string& dek) {
getAdapter().getDekTableLevelForUpdate(dek);
}
inline void setDekColLevelForUpdate(const std::string& col_name, const std::string& dek_tmp) {
getAdapter().setDekColLevelForUpdate(col_name, dek_tmp);
}
inline void getDekColLevelForUpdate(const std::string& col_name, std::string& dek_tmp) {
getAdapter().getDekColLevelForUpdate(col_name, dek_tmp);
}
inline void getAllDekColLevelForUpdate(std::unordered_map<std::string, std::string>& column_deks) {
getAdapter().getAllDekColLevelForUpdate(column_deks);
}
inline void clearDek() {
getAdapter().clearDek();
}
inline void clearDekForUpdate() {
getAdapter().clearDekForUpdate();
}
// ORE 专用 DEK 接口
// inline void setDekOnlyForOre(const std::string& dek) {
// getAdapter().setDekOnlyForOre(dek);
// }
// inline void clearDekOnlyForOre() {
// getAdapter().clearDekOnlyForOre();
// }
// inline char* getDekOnlyForOre() {
// return getAdapter().getDekOnlyForOre();
// }
inline bool isRotateCmd(){
return getAdapter().isRotateCmd();
}
// 定义轮换类型枚举
enum RotationType {
ROTATE_ALL, // 轮换表级和所有列级密钥
ROTATE_TABLE, // 只轮换表级密钥
ROTATE_COLUMNS // 只轮换指定列的密钥
};
// 轮换命令解析结果结构
struct RotateCommandResult {
bool valid; // 命令是否有效
RotationType type; // 轮换类型
std::string tableName; // 表名
std::string enc_tableName; // 加密表名
std::set<std::string> cols_set; // 命令涉及的列名列表 用于快速检索轮换命令中是否有这个列
std::unordered_set<std::string> enc_cols_set; // 需要更新的密钥的密文列名
std::unordered_map<std::string, std::string> col_map; // 明文列名 和 密文列名的映射
std::unordered_map<std::string, std::string> col_type; // 列的类型
std::string errorMessage; // 错误信息
};
RotateCommandResult parseRotateCommand(const std::string& command,const std::string &user_name,const std::string &db_name);
// test
void printRotateCommandResult(const RotateCommandResult& result);
void connectionDelete();
void connectionUpdateDek(RotateCommandResult &result);
void connectionUpdateDek_Init(RotateCommandResult &result);
void connectionUpdateDek_Update(RotateCommandResult& result);
void connectionUpdateDek_Final(RotateCommandResult& result);
void connectionInsertTest();
void connectionSelectTest();
void connectionSelect();
using json = nlohmann::json;
// 读取 JSON 文件
json read_json_from_file(const std::string& file_path);
// 获取表中所有列
std::vector<std::string> get_columns(const std::string& table_name, const json& j);
// 获取表中所有列
std::set<std::string> get_all_columns(const std::string& table_name, const json& j);
// 获取表中列的映射关系
std::unordered_map<std::string, std::string> get_column_mapping(const std::string& table_name, const json& j);
// 获取列的数据类型
std::string get_column_type(const std::string& table_name, const std::string& column_name, const json& j);
static int executeSQL(const char *sql, const char *errorMsg);
static int tableExists(const char *tableName);
int backupDekStore();
int deleteDekStoreBackup();
int restoreDekStore();
} // namespace DekAPI
#endif // DB_INTERFACE_HPP

View File

@@ -0,0 +1,83 @@
// db_adapter.hpp
#ifndef DEK_ADAPTER_HPP
#define DEK_ADAPTER_HPP
#include <string>
#include <queue>
#include <unordered_map>
#include <memory>
#include "kms/kms_common.hpp"
class DekManager {
private:
std::string user_name_;
std::string db_name_;
std::string table_name_;
std::queue<std::string> col_name_;
std::unordered_map<std::string, std::string> col_dek_;
std::unordered_map<std::string, std::string> col_dek_update_;
std::string table_dek_;
std::string table_dek_update_;
DekManager() = default;
DekManager(const std::string& user_name, const std::string& db_name ):user_name_(user_name),db_name_(db_name){}
public:
~DekManager() = default;
DekManager(const DekManager&) = delete;
DekManager& operator=(const DekManager&) = delete;
static DekManager& getInstance() {
static thread_local DekManager instance;
return instance;
}
void initialize(const std::string& user_name, const std::string& db_name);
// DEK 管理
// bool storeDek(const DEK& dek);
// bool deleteDek(const std::string& user_name, const std::string& table, const std::string& column);
// bool createDek(std::string& col_dek, const std::string& column_name);
// 数据库信息设置
void setInfoUser(const std::string& user_name);
void setInfoDb(const std::string& db_name);
void setInfoTable(const std::string& table_name);
void setInfoCol(const std::string& col_name);
std::string getInfoUser();
std::string getInfoDb();
std::string getInfoTable();
std::string getInfoCol();
// DEK 缓存管理
// Col Level
void setDekColLevel(const std::string& col_name, const std::string& dek_tmp);
void getDekColLevel(const std::string& col_name, std::string& dek_tmp);
void setDekColLevelForUpdate(const std::string& col_name, const std::string& dek_tmp) ;
void getDekColLevelForUpdate(const std::string& col_name, std::string& dek_tmp) ;
// Tabel Level
void setDekTableLevel(const std::string& dek);
void getDekTableLevel(std::string& dek);
void setDekTableLevelForUpdate(const std::string& dek);
void getDekTableLevelForUpdate(std::string& dek) ;
void getAllDekColLevelForUpdate(std::unordered_map<std::string, std::string>& column_deks) ;
void clearDek() ;
void clearDekForUpdate() ;
// ORE 专用 DEK
// void setDekOnlyForOre(const std::string& dek) ;
// void clearDekOnlyForOre() ;
// char* getDekOnlyForOre() ;
bool isRotateCmd(){
return table_dek_update_ != "" || col_dek_update_.size() != 0;
}
};
#endif // DB_ADAPTER_HPP

24837
include/kmsAdapter/json.hpp Executable file

File diff suppressed because it is too large Load Diff