news 2026/4/17 23:56:50

MySQL UDF 一例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 15:18:30

短期合作项目SolidWorks临时许可证配置与管理流程

短期合作项目中SolidWorks临时许可证配置与管理流程&#xff1a;你需要知道的全部如果你正在参与一个短期合作项目&#xff0c;你一定听过“临时许可证”这个词。这个概念听起来有点陌生&#xff0c;但实际上在工程设计、产品开发、跨部门协作等场景中&#xff0c;它却是一个关…

作者头像 李华
网站建设 2026/3/16 3:37:56

C#实现指纹识别

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

作者头像 李华
网站建设 2026/4/18 2:19:17

大模型应用RAG系列(一):初识RAG,RAG出现及未来发展趋势

之前我们在讲大模型的应用方向和架构时&#xff0c;有提到RAG、Agent、Fine-Tune。在作者写大模型专题的文章时&#xff0c;也是边学习&#xff0c;边梳理&#xff0c;边总结。在这个过程中&#xff0c;大模型在各个方向都不断地快速发展&#xff0c;对应的paper、理论、方向也…

作者头像 李华
网站建设 2026/4/18 8:48:53

基于STM32单片机多功能婴儿床控制系统 尿液检测 防掉床 蓝牙

目录 STM32单片机多功能婴儿床控制系统概述尿液检测模块防掉床模块蓝牙通信模块系统整合与优化 源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; STM32单片机多功能婴儿床控制系统概述 该系统基于STM32单片机设计&#xff0c;整合了尿液…

作者头像 李华
网站建设 2026/3/13 7:03:10

基于STM32单片机老人睡眠质量检测 心率体温监测 报警 电子DIY

目录基于STM32的老人睡眠质量监测系统硬件组成软件设计电子DIY注意事项扩展功能源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于STM32的老人睡眠质量监测系统 该系统利用STM32单片机作为核心控制器&#xff0c;结合多种传感器实时监…

作者头像 李华