This commit is contained in:
blue-lemon0104
2026-04-07 15:45:41 +08:00
parent 0120fa9ce3
commit 46fa58f6f8
27 changed files with 527 additions and 2818 deletions

View File

@@ -9,12 +9,7 @@ RotateCommandResult parseRotateCommand(const std::string& command,const std::str
result.valid = false;
std::string current_cmk;
//得到当前用户的cmk
// cmk_mapperGetCmkByUsername(user_name, current_cmk);
//存储当前cmk
// cmk_mapperSetCurrentCmk(current_cmk);
// cmk_mapperSetInfoUser(user_name);
// cmk_mapperSetInfoDb(db_name);
DekInterface::setInfoUser(user_name);
DekInterface::setInfoDb(db_name);
@@ -147,9 +142,6 @@ void connectionDelete() {
// 构建删除查询
std::string query = "DELETE FROM dek_store WHERE ";
// query.append("username = '").append(cmk_mapperGetInfoUser()).append("' AND ")
// .append("db = '").append(cmk_mapperGetInfoDb()).append("' AND ")
// .append("t = '").append(cmk_mapperGetInfoTable()).append("'");
query.append("username = '").append(DekInterface::getInfoUser()).append("' AND ")
.append("db = '").append(DekInterface::getInfoDb()).append("' AND ")
.append("t = '").append(DekInterface::getInfoTable()).append("'");
@@ -273,8 +265,6 @@ void connectionUpdateDek_Init(RotateCommandResult &cmd) {
// 判断 如果是 NULL 则为表级密钥 && (轮换表级||轮换全部) -> 需要轮换表密钥
if (PQgetisnull(res1, i, 0)) { // 如果列名是NULL表示这是表级密钥
// 创建新密钥
// if (cmk_mapperCreateDek(dek_for_update, "")) { // 表级密钥使用空列名
// cmk_mapperDecryptDek(dek_for_update, cmk);
if (KMSInterface::createDek(dek_for_update, "")) { // 表级密钥使用空列名, 也可以DekAPI::getInfoTable())
KMSInterface::decryptData(dek_for_update);
} else {
@@ -282,10 +272,8 @@ void connectionUpdateDek_Init(RotateCommandResult &cmd) {
}
if(cmd.type == ROTATE_TABLE || cmd.type == ROTATE_ALL) {
// cmk_mapperSetDekTableLevelForUpdate(dek_for_update);
DekInterface::setDekTableLevelForUpdate(dek_for_update);
}else{
// cmk_mapperSetDekTableLevelForUpdate(dek);
DekInterface::setDekTableLevelForUpdate(dek);
}
}else{
@@ -294,8 +282,6 @@ void connectionUpdateDek_Init(RotateCommandResult &cmd) {
plain = plain.substr(0,plain.rfind('_'));
// 创建新密钥,使用加密后的列名
// if (cmk_mapperCreateDek(dek_for_update, col_name)) { // 使用加密后的列名
// cmk_mapperDecryptDek(dek_for_update, cmk);
if (KMSInterface::createDek(dek_for_update, col_name)) { // 使用加密后的列名
KMSInterface::decryptData(dek_for_update);
} else {
@@ -304,19 +290,15 @@ void connectionUpdateDek_Init(RotateCommandResult &cmd) {
if(cmd.type == ROTATE_TABLE){ // 轮换表级密钥
all_columns.erase(plain);
// cmk_mapperSetDekStoreTmpForUpdate(col_name, dek); // 这些列使用旧密钥
DekInterface::setDekColLevelForUpdate(col_name, dek);
} else if(cmd.type == ROTATE_ALL){ // 轮换所有密钥
cmd.enc_cols_set.insert(col_name); // 存储密文列名
// cmk_mapperSetDekStoreTmpForUpdate(col_name, dek_for_update); // dek_store中的所有密钥都要轮换
DekInterface::setDekColLevelForUpdate(col_name, dek_for_update);
} else if(cmd.type == ROTATE_COLUMNS){ // 轮换指定列密钥
if(cmd.cols_set.find(plain) != cmd.cols_set.end()){ // 判断dek_store中的列是否在命令中是的话用新密钥不是则用旧密钥
cmd.enc_cols_set.insert(col_name); // 存储密文列名
// cmk_mapperSetDekStoreTmpForUpdate(col_name,dek_for_update);
DekInterface::setDekColLevelForUpdate(col_name, dek_for_update);
}else{
// cmk_mapperSetDekStoreTmpForUpdate(col_name,dek);
DekInterface::setDekColLevelForUpdate(col_name, dek);
}
}
@@ -542,16 +524,13 @@ void connectionUpdateDek_Final(RotateCommandResult &cmd) {
// 获取待更新的表级密钥
std::string table_dek_for_update;
// cmk_mapperGetDekTableLevelForUpdate(table_dek_for_update);
DekInterface::getDekTableLevelForUpdate(table_dek_for_update);
// 获取CMK
// std::string cmk = cmk_mapperGetCurrentCmk();
// 如果有表级密钥需要更新
if (cmd.type != ROTATE_COLUMNS && !table_dek_for_update.empty()) {
// 加密表级密钥
// cmk_mapperEncryptDek(table_dek_for_update, cmk);
KMSInterface::encryptData(table_dek_for_update);
if (table_dek_for_update.empty()) {
fprintf(stderr, "Encrypt table DEK failed\n");
@@ -580,7 +559,6 @@ void connectionUpdateDek_Final(RotateCommandResult &cmd) {
if(!cmd.cols_set.empty() && cmd.type != ROTATE_TABLE){
// 获取所有待更新的列级密钥
std::unordered_map<std::string, std::string> column_deks;
// cmk_mapperGetAllDekStoreTmpForUpdate(column_deks);
DekInterface::getAllDekColLevelForUpdate(column_deks);
// 更新列级密钥
@@ -642,19 +620,9 @@ void connectionInsertTest() {
}
std::string table_dek;
// 获取CMK
// std::string cmk = cmk_mapperGetCurrentCmk();
// cmk_mapperGetCmkByUsername(cmk_mapperGetInfoUser(), cmk);
// if (cmk_mapperCreateDek(table_dek, "")) { // 表级密钥使用空列名
if (KMSInterface::createDek(table_dek, "")) { // 表级密钥使用空列名
// cmk_mapperEncryptDek(table_dek, cmk); // 加密表级密钥create里写了加密所以不需要
std::string query1 = "insert into dek_store values";
std::string tuple1 = "(";
// tuple1.append("'").append(cmk_mapperGetInfoUser()).append("',")
// .append("'").append(cmk_mapperGetInfoDb()).append("',")
// .append("'").append(cmk_mapperGetInfoTable()).append("',")
// .append("NULL,")
// .append("'").append(table_dek).append("')");
tuple1.append("'").append(DekInterface::getInfoUser()).append("',")
.append("'").append(DekInterface::getInfoDb()).append("',")
@@ -672,15 +640,8 @@ void connectionInsertTest() {
// 处理所有列密钥
while (!tmp1.empty()) {
std::string col_dek;
// if (cmk_mapperCreateDek(col_dek, tmp1)) { // 使用当前列名作为参数
if(KMSInterface::createDek(col_dek, tmp1)) {
// cmk_mapperEncryptDek(col_dek, cmk); // 加密列级密钥
std::string tuple_col = "(";
// tuple_col.append("'").append(cmk_mapperGetInfoUser()).append("',")
// .append("'").append(cmk_mapperGetInfoDb()).append("',")
// .append("'").append(cmk_mapperGetInfoTable()).append("',")
// .append("'").append(tmp1).append("',")
// .append("'").append(col_dek).append("')");
tuple_col.append("'").append(DekInterface::getInfoUser()).append("',")
.append("'").append(DekInterface::getInfoDb()).append("',")
.append("'").append(DekInterface::getInfoTable()).append("',")
@@ -768,23 +729,17 @@ void connectionSelect() {
int nrows = PQntuples(res1);
// 获取CMK
// std::string cmk = cmk_mapperGetCurrentCmk();
// cmk_mapperGetCmkByUsername(cmk_mapperGetInfoUser(), cmk);
for (int i = 0; i < nrows; i++) { // 遍历每一行
std::string col_name(PQgetvalue(res1, i, 0)); // 列名
std::string dek(PQgetvalue(res1, i, 1)); // 对应的密钥
// 解密密钥
// cmk_mapperDecryptDek(dek, cmk);
KMSInterface::decryptData(dek);
if (PQgetisnull(res1, i, 0)) { // 如果列名是NULL表示这是表级密钥
// cmk_mapperSetDekTableLevel(dek);
DekInterface::setDekTableLevel(dek);
// dek_for_decrypt = dek;
} else { // 否则是列级密钥
// cmk_mapperSetInfoDekTmp(col_name, dek);
DekInterface::setDekColLevel(col_name, dek);
}
}