select * from t_test_aes where message_id = '0xF3F4127D4D1AEC1DC5A620CE5E8C7F4F';
drop table if exists t_test_aes;
CREATE TABLE `t_test_aes` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`message_id` BLOB(20) NOT NULL COMMENT '消息Id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='aes测试表';
## 添加数据
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message2', 'test_key'));
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message3', 'test_key'));
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message4', 'test_key'));
## 添加数据
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message2', 'test_key'));
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message3', 'test_key'));
insert into t_test_aes( message_id) values ( AES_ENCRYPT('test_message4', 'test_key'));
## 查询数据
select * from t_test_aes where AES_DECRYPT(message_id, 'test_key') like '%2%';
select * from t_test_aes where message_id = '0xF3F4127D4D1AEC1DC5A620CE5E8C7F4F';
test_message_one 使用4个字符为一组的加密方式, 第一组test,第二组est_,第三组st_m,第四组t_mes … 依次类推。
如果需要检索所有包含检索条件4个字符的数据比如:test,加密字符后通过 key like “%partial%” 查库。
重要:要实现以上加密算法的模糊查询,必须有固定的加密算法满足以下需求:
假如原序列 A 加密后的 值是X
那么存在 A的连续子序列 B 加密后的值是Y
必须保证 Y 也是X 的连续子序列
例如如下加密算法的结果久满足需求:
test_message_one 加密后值为 whvwbphvvdjhbrqh
test 加密之后的值为 whvw
drop table if exists t_test_aes_target;
CREATE TABLE `t_test_aes_target` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`message_id` varchar(256) NOT NULL COMMENT '消息Id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='加密测试表';
drop table if exists t_test_aes_sub;
CREATE TABLE `t_test_aes_sub` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`target_id` bigint(20) NOT NULL COMMENT 'id',
`origin_msg` varchar(256) NOT NULL COMMENT '消息Id',
`message_id_buf` varchar(256) NOT NULL COMMENT '消息Id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='拆分加密测试表';
insert into t_test_aes_target(id, message_id) values (1, 'whvwbphvvdjhbrqh');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'test' , 'whvw');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'est_' , 'hvwb');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'st_m' , 'vwbp');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 't_me' , 'wbph');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, '_mes' , 'bphv');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'mess' , 'phvv');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'essa' , 'hvvd');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'ssag' , 'vvdj');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'sage' , 'vdjh');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'age_' , 'djhb');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'ge_o' , 'jhbr');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, 'e_on' , 'hbrq');
insert into t_test_aes_sub(target_id, origin_msg, message_id_buf) values (1, '_one' , 'brqh');
// 加密方法
public static String encrypt(String input) {
return shiftString(input, SHIFT);
}
// 通过ASCII值偏移量来加密字符串
private static String shiftString(String input, int shift) {
char[] chars = input.toCharArray();
for (int i = 0; i < chars.length; i++) {
chars[i] = (char) (chars[i] + shift);
}
return new String(chars);
}
public static List<String> splitStringByCharacterType(String input, Integer num) {
if(StringUtils.isBlank(input)){
return Arrays.asList();
}
if(input.length() <= 4){
return Arrays.asList(input);
}
List<String> result = new ArrayList<>();
for (int i = 0; i <= input.length() - 4; i++) {
result.add(input.subSequence(i, i+4).toString());
}
return result;
}
select * from t_test_aes_target where message_id like '%whvw%';
select * from t_test_aes_target where id in (select id from t_test_aes_sub where message_id_buf like '%whvw%');