业务背景
我的很多资料,都是明文保存在三方的云数据库的,不是没想过加密,问题是加密之后,就无法搜索了,面对大量信息,无法模糊检索可谓硬伤。
难道真的就没有办法了吗?我坚信一定是有的,只是我还没有发现或想出来而已。
这不,最近受Base64编码原理的启发,豁然开朗,Base64因为是3个字节合并为一组(24位),再平分成4组,每组6位,因此无法保证字节的双向映射,也因此无法搜索。
那我实现一个Base16编码,将每个字节一分为二,前4位一组,后4位一组,不就可以保证字节的双向映射,从而实现可搜索编码了嘛?
说干就干,也就2个方法,满打满算30多行代码,出奇的简单!
代码实现
public class Base16 {
/**
* 对文本进行 base16 编码
*/
public static String encode(String text) {
byte[] bytes = text.getBytes(StandardCharsets.UTF_8); // 转换为字节数组
StringBuilder builder = new StringBuilder();
for (byte b : bytes) {
byte b1 = (byte) (b >> 4 & 0b00001111); // 取高4位
byte b2 = (byte) (b & 0b00001111); // 取低4位
String s1 = Integer.toHexString(b1);
String s2 = Integer.toHexString(b2);
builder.append(s1).append(s2);
}
return builder.toString();
}
/**
* 将 base16 解码为明文
*/
public static String decode(String base16) {
char[] chars = base16.toCharArray();
byte[] bytes = new byte[chars.length / 2];
for (int i = 0; i < chars.length; i += 2) {
String s1 = String.valueOf(chars[i]);
String s2 = String.valueOf(chars[i + 1]);
byte b1 = Byte.parseByte(s1, 16);
byte b2 = Byte.parseByte(s2, 16);
b1 = (byte) (b1 << 4);
byte b = (byte) (b1 + b2);
bytes[i / 2] = b;
}
return new String(bytes, StandardCharsets.UTF_8);
}
}
网友评论