核心内容摘要
48岁阿姨的西部狂想曲:在《荒野大镖客2》的枪林弹雨中重燃青春
目录
功能
des_encrypt.cc 代码
使用动态库编译
复制到 MySQL 插件目录
重启 MySQL
创建函数并调用执行
功能在 MySQL 中实现 DES/ECB/PKCS5Padding 加密算法。
des_encrypt.cc 代码#include stdio.h #include stdlib.h #include string.h #include mysql.h #include openssl/des.h #include openssl/md
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 !
{ 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]; //
构建字符串 char plaintext[256]; snprintf(plaintext, sizeof(plaintext), %lld,%lld,%lld, userID, diamondCount, updateTime); //
DES加密 DES_key_schedule schedule; DES_cblock key_block; memset(key_block, 0, sizeof(key_block)); strncpy((char*)key_block, key,
; DES_set_key_unchecked(key_block, schedule); int text_len (int)strlen(plaintext); int pad_len 8 - (text_len %
; if (pad_len
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
{ DES_ecb_encrypt((DES_cblock*)(padded_input i), (DES_cblock*)(des_output i), schedule, DES_ENCRYPT); } //
转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; //
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); //
关键直接写入result缓冲区作为字符串 for (int i 0; i 16; i) { sprintf(result i * 2, %02x, md5_digest[i]); } result[32] \0; // null终止 //
告诉MySQL这是32个字符的字符串 *length 32; // 清理内存 free(padded_input); free(des_output); return result; }
使用动态库编译g -fPIC -shared -o des_encrypt.so des_encrypt.cc \ -I/home/mysql/mysql-
8.
22/include \ -I/usr/include/openssl \ -L/home/mysql/mysql-
8.
22/lib \ -Wl,-rpath,/home/mysql/mysql-
8.
22/lib \ -lmysqlclient -lssl -lcrypto
复制到 MySQL 插件目录cp des_encrypt.so /home/mysql/mysql-
8.
22/lib/plugin/ chmod 755 /home/mysql/mysql-
8.