MySQL UDF 一例

目录

1. 功能

2. des_encrypt.cc 代码

3. 使用动态库编译

4. 复制到 MySQL 插件目录

5. 重启 MySQL

6. 创建函数并调用执行


1. 功能

在 MySQL 中实现 DES/ECB/PKCS5Padding 加密算法。

2. des_encrypt.cc 代码

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <mysql.h> #include <openssl/des.h> #include <openssl/md5.h> #ifndef my_bool #define my_bool unsigned char #endif extern "C" { my_bool direct_checksum_init(UDF_INIT *initid, UDF_ARGS *args, char *message); void direct_checksum_deinit(UDF_INIT *initid); char *direct_checksum(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error); } my_bool direct_checksum_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { if (args->arg_count != 4) { strcpy(message, "需要4个参数: userID, diamondCount, updateTime, key"); return 1; } initid->max_length = 32; return 0; } void direct_checksum_deinit(UDF_INIT *initid) {} char *direct_checksum(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error) { if (!args->args[0] || !args->args[1] || !args->args[2] || !args->args[3]) { *is_null = 1; return NULL; } // 获取参数 long long userID = *((long long*)args->args[0]); long long diamondCount = *((long long*)args->args[1]); long long updateTime = *((long long*)args->args[2]); char *key = args->args[3]; // 1. 构建字符串 char plaintext[256]; snprintf(plaintext, sizeof(plaintext), "%lld,%lld,%lld", userID, diamondCount, updateTime); // 2. DES加密 DES_key_schedule schedule; DES_cblock key_block; memset(&key_block, 0, sizeof(key_block)); strncpy((char*)&key_block, key, 8); DES_set_key_unchecked(&key_block, &schedule); int text_len = (int)strlen(plaintext); int pad_len = 8 - (text_len % 8); if (pad_len == 0) pad_len = 8; int total_len = text_len + pad_len; // 分配内存 unsigned char *padded_input = (unsigned char*)malloc(total_len); unsigned char *des_output = (unsigned char*)malloc(total_len); memcpy(padded_input, plaintext, text_len); for (int i = 0; i < pad_len; i++) { padded_input[text_len + i] = (unsigned char)pad_len; } // ECB模式加密 for (int i = 0; i < total_len; i += 8) { DES_ecb_encrypt((DES_cblock*)(padded_input + i), (DES_cblock*)(des_output + i), &schedule, DES_ENCRYPT); } // 3. 转16进制字符串 char hex_str[1024]; for (int i = 0; i < total_len; i++) { sprintf(hex_str + i * 2, "%02x", des_output[i]); } hex_str[total_len * 2] = '\0'; // 4. MD5加密 MD5_CTX md5_ctx; unsigned char md5_digest[16]; MD5_Init(&md5_ctx); MD5_Update(&md5_ctx, hex_str, (unsigned long)strlen(hex_str)); MD5_Final(md5_digest, &md5_ctx); // 5. 关键:直接写入result缓冲区作为字符串 for (int i = 0; i < 16; i++) { sprintf(result + i * 2, "%02x", md5_digest[i]); } result[32] = '\0'; // null终止 // 6. 告诉MySQL这是32个字符的字符串 *length = 32; // 清理内存 free(padded_input); free(des_output); return result; }

3. 使用动态库编译

g++ -fPIC -shared -o des_encrypt.so des_encrypt.cc \ -I/home/mysql/mysql-8.0.22/include \ -I/usr/include/openssl \ -L/home/mysql/mysql-8.0.22/lib \ -Wl,-rpath,/home/mysql/mysql-8.0.22/lib \ -lmysqlclient -lssl -lcrypto

4. 复制到 MySQL 插件目录

cp des_encrypt.so /home/mysql/mysql-8.0.22/lib/plugin/ chmod 755 /home/mysql/mysql-8.0.22/lib/plugin/des_encrypt.so

5. 重启 MySQL

mysqladmin -uroot -p123456 -S /data/3306/mysqldata/mysql.sock shutdown mysqld_safe --defaults-file=/home/mysql/my.cnf &

6. 创建函数并调用执行

use test; create function direct_checksum returns string soname 'des_encrypt.so'; select UserID,DiamCount,UpdateTimeJava, cast(direct_checksum(UserID,DiamondCount,UpdateTimeJava, 'gnbihUyr') as char) CheckSum from t1 limit 20;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1220394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IK-M20的体验

IK-M20的体验IK-M20的体验设备参数CPU: MEDIATEK MT7628NN RAM 128MB: winbond W971GG6SB-25 FLASH 32MB: MXIC MX25L25635FMI-10G 16脚 设备是5口百兆,没有无线,5个网口灯,一个系统灯,一个网络状态灯,一个电源指…

VRRP:智算中心网络高可用的关键技术

VRRP协议概述VRRP (Virtual Router Redundancy Protocol) 是一种旨在解决局域网内默认网关单点故障问题的容错协议。通过 VRRP&#xff0c;多台物理路由器或交换机可以逻辑上聚合为一个“虚拟路由器”&#xff0c;并对外统一提供一个虚拟 IP (VIP)。对于终端设备&#xff08;如…

Python包管理|如何解决 pip install requests[socks] 报错:zsh:1: no matches found: requests[socks] 问题

摘要 你想解决在zsh终端中执行pip install requests[socks]时&#xff0c;抛出zsh:1: no matches found: requests[socks]错误的问题。这个错误并非pip或requests包的问题&#xff0c;核心根源是zsh的文件名扩展&#xff08;Globbing&#xff09;机制——zsh会将中括号[]解析为…

如何解决 pip install 与 PyCharm 解释器版本不一致导致导入失败问题

摘要 你想解决因pip install安装包时使用的Python解释器&#xff0c;与PyCharm项目配置的解释器版本/路径不一致&#xff0c;导致在PyCharm中导入包提示ModuleNotFoundError或“Unresolved reference”的问题。这个问题是Python开发中新手高频踩坑点——核心根源是PyCharm的项…

如何解决 pip install 导入失败 因 PYTHONPATH 污染(本地同名包遮蔽)问题

摘要 你想解决因PYTHONPATH环境变量配置异常&#xff08;路径优先级过高&#xff09; 或项目目录下存在与第三方包同名的文件/目录&#xff0c;导致pip安装的第三方包被“遮蔽”&#xff0c;导入时提示ModuleNotFoundError、导入错误模块&#xff08;如本地同名文件&#xff0…

Python系列环境兼容|如何解决 pip install 平台报错 GLIBC_2.64 not found(manylinux 与系统不兼容)问题

摘要 你想解决在Linux系统下执行pip install时&#xff0c;因第三方包的预编译manylinux版本依赖高版本GLIBC&#xff08;如2.64&#xff09;&#xff0c;而你的系统GLIBC版本过低&#xff08;如CentOS 7的2.17、Ubuntu 18.04的2.27&#xff09;&#xff0c;导致报错ImportErr…

Python系列环境兼容|如何解决 pip install 平台报错 macOS arm64 无预编译轮子(需 Rosetta/源码)问题

摘要 你想解决在Apple Silicon&#xff08;M1/M2/M3/M4芯片&#xff0c;架构为arm64&#xff09;的macOS系统下&#xff0c;执行pip install时因第三方包未提供arm64架构的预编译wheel&#xff08;轮子&#xff09;包&#xff0c;导致pip自动尝试源码编译&#xff08;常报错缺…

OpenEuler编译兼容|如何解决checking for liblz4... no configure: error: Package requirements (liblz4)问题

摘要 你想解决在OpenEuler系统中编译软件&#xff08;如MySQL、Redis、自定义C/C程序等&#xff09;时&#xff0c;执行configure脚本报错checking for liblz4... no&#xff0c;最终提示configure: error: Package requirements (liblz4) were not met的问题。这个问题是Open…

AI框架兼容|如何解决RuntimeError: Only Hopper supports different V headdim 问题

摘要 你想解决在非NVIDIA Hopper架构GPU&#xff08;如A100、RTX 4090/3090、A10、T4等&#xff09;上运行大模型训练/推理代码时&#xff0c;出现RuntimeError: Only Hopper supports different V headdim的报错问题。这个错误是GPU架构与Attention特性不兼容的典型陷阱——核…

如何解决 pip install 未激活虚拟环境导致安装到系统 Python 问题

摘要 你想解决因未激活Python虚拟环境&#xff0c;执行pip install时第三方包被错误安装到系统级Python环境&#xff0c;而非目标虚拟环境的问题。这个问题是Python环境管理中新手最高频的错误之一——核心根源是虚拟环境未激活时&#xff0c;终端的python/pip命令默认指向系统…

多相机无重叠区域的坐标系统一(大标定板歪斜情况下的精确物理坐标获取)

标定板歪斜情况下的精确物理坐标获取 一、问题核心 当标定板刻度存在歪斜&#xff08;X/Y轴非正交方向&#xff09;时&#xff0c;不能直接使用刻度读数作为物理坐标。必须通过单应性变换&#xff08;Homography&#xff09;校正标定板的投影变形&#xff0c;将图像坐标转换到精…

安科瑞ASLP-LMB 智能防雷环境预警监测箱

定时采集一次终端数据&#xff0c;采集数据保存本机&#xff0c;且断电不丢失&#xff1b; 故障数据报警、雷击数据立即发送到服务器、实时数据定期发送到服务器&#xff1b;具备快速部署特征&#xff0c;集工业控制电脑、网络服务器为一体&#xff1b;可实现数据采集、分析、处…

客户端负载均衡与服务端负载均衡解释与对比

前言 在分布式系统和微服务架构日益普及的今天&#xff0c;负载均衡已经成为保障系统高可用、高性能的关键技术。然而&#xff0c;在实际架构设计中&#xff0c;开发团队经常面临一个重要的选择&#xff1a;客户端负载均衡还是服务端负载均衡&#xff1f; 这两种方案各有千秋…

分布式事务概念解析

前言 在微服务架构盛行的今天&#xff0c;分布式事务已经成为每个后端开发者必须面对的核心技术难题。如何在保证数据一致性的同时维持系统的高可用性&#xff1f;本文将系统性地介绍分布式事务的核心概念、面临的挑战以及主流解决方案。一、分布式事务的核心概念 1.1 事务的AC…

知识管理的智能进化:企业级智能体开发平台如何打造企业“第二大脑”?

在知识经济时代&#xff0c;企业最大的浪费往往是知识的流失与孤岛化。企业级智能体开发平台为企业构建“组织智慧中枢”或“第二大脑”提供了前所未有的可能&#xff0c;它能将散落的知识连接起来&#xff0c;并使其变得可对话、可推理、可行动。 从“搜索”到“问答”&#…

赋能智慧教育:企业级智能体开发平台在个性化学习与校园管理中的应用

教育领域正寻求因材施教与规模化管理的平衡。企业级智能体开发平台为构建“AI助教”和“智能校园管理中枢”提供了技术基础&#xff0c;有望推动教学方式与教育管理的深刻变革。 一、个性化学习伙伴与智能辅导 学习智能体可以为每位学生充当“个性化学习伙伴”。它能根…

2026年正规防静电地板厂家推荐指南

2026年正规防静电地板厂家推荐指南一、行业背景与推荐逻辑据《2026至2030年中国PVC防静电活动地板行业发展研究报告》显示,国内防静电地板市场规模预计从2026年的87.6亿元增长至2030年的152亿元,年复合增长率达11.8%…

C#实现指纹识别

一、开发环境配置 基础框架 .NET Framework 4.8Visual Studio 2022OpenCvSharp 4.8&#xff08;图像处理&#xff09;Microsoft.ML.OnnxRuntime&#xff08;深度学习模型支持&#xff09; 硬件依赖 支持USB通信的指纹识别器&#xff08;如中控4000B系列&#xff09;驱动程序&am…

2026上海GEO服务商甄选指南:技术实力与落地能力测评

2026年&#xff0c;生成式AI技术迈入精细化运营深水区&#xff0c;AI语义建模深度化、跨平台落地一体化、云原生安全合规化成为生成式引擎优化&#xff08;GEO&#xff09;的核心技术内核&#xff0c;向量数据库架构适配、检索增强生成&#xff08;RAG&#xff09;管线优化、多…

Skills vs Prompt vs MCP:从“工具调用“到“AI智能体“的跃迁,这篇文章值得收藏!

本文深入探讨了Skills的本质及其与Prompt和MCP的区别&#xff0c;指出Skills不仅是模块化Prompt&#xff0c;更是提供完整认知模型。Skills包含元认知层&#xff08;定义身份与价值&#xff09;、显式决策逻辑层和问题解决螺旋机制&#xff0c;使AI从"规则遵循"升级为…