首页 > 数据库 >【JAVA】数据库加密字段搜索方案

【JAVA】数据库加密字段搜索方案

时间:2022-08-24 15:23:46浏览次数:84  
标签:加密 String InvalidKeyException 数据库 throws static import JAVA public

今天看到一篇文章,讲到加密字段的模糊查询,看到这个标题的时候心里还没有太明确的答案,怀着学习的心态看完了整篇文章,然后又查阅了很多文章都没有具体实现代码片断,于是乎就试一下!

大致分为三类做法,如下所示:

  • 沙雕做法(不动脑思考直男的思路,只管实现功能从不深入思考问题)
  • 常规做法(思考了查询性能问题,也会使用一些存储空间换性能等做法)
  • 超神做法(比较高端的做法从算法层面上思考)

我们直接用常规做法,对密文数据进行分词组合,将分词组合的结果集分别进行加密,然后存储到扩展列,原来阿里拼多多京东都是这么干的,查询时通过key like '%partial%'

直接上代码:

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;

import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Base64;

/**
 * @author 小菜鸟
 */
public class EncryptTool {
    // 算法类型
    public static final String DES = "DES";
    // 密钥
    public static final String SECRET_KEY = "12345678";
    // 模糊查询字段全文
    public static final String encryptString = "guangyi";
    // 所有分词
    public static final String[] partialStrs = new String[] {"guan", "uang", "angy", "ngyi", "guang", "uangy", "angyi", "guangy", "uangyi", "guangyi"};

    public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
        // 搜索条件
        System.out.println(search("guan"));     // true
        System.out.println(search("q1"));       // false
        System.out.println(search("uanga"));    // false
        System.out.println(search("uangy"));    // true
    }

    /**
     * 拿到全文分段加密后的汇总字段
     * @return
     * @throws NoSuchPaddingException
     * @throws IllegalBlockSizeException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     * @throws BadPaddingException
     * @throws InvalidKeyException
     */
    public static String getEncryptString() throws NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, InvalidKeySpecException, BadPaddingException, InvalidKeyException {
        StringBuffer encryptedStr = new StringBuffer();
        for (String partialS : partialStrs) {
            encryptedStr.append(desEncode(partialS));
        }
        return encryptedStr.toString();
    }

    /**
     * 模拟数据库 like 搜索
     * @param sStr
     * @return
     * @throws NoSuchPaddingException
     * @throws IllegalBlockSizeException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     * @throws BadPaddingException
     * @throws InvalidKeyException
     */
    public static boolean search(String sStr) throws NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, InvalidKeySpecException, BadPaddingException, InvalidKeyException {
        return getEncryptString().contains(desEncode(sStr));
    }

    /**
     * 加密算法
     * @param encryptString
     * @return
     * @throws NoSuchPaddingException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws InvalidKeySpecException
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     */
    public static String desEncode(String encryptString) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException {
        SecretKeyFactory des = SecretKeyFactory.getInstance(DES);
        SecretKey secretKey = des.generateSecret(new DESKeySpec(SECRET_KEY.getBytes()));
        Cipher cipher = Cipher.getInstance(DES);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        return new String(Base64.getEncoder().encode(cipher.doFinal(encryptString.getBytes())));
    }
}

  

 

参考:

https://mp.weixin.qq.com/s/f4GMXXYxufRG9Op0Z2VZ8A

标签:加密,String,InvalidKeyException,数据库,throws,static,import,JAVA,public
From: https://www.cnblogs.com/garinzhang/p/16620057.html

相关文章

  • SpringMVC、MVC、JavaBean、表述层、三层架构
    来源:BV1Ry4y1574R?p=3、BV1Ry4y1574R?p=4SpringMVC是Spring的MVC模块,也就是来实现Web功能的模块。Spring里面包含有很多的模块,比如说SpringFramework是它的......
  • JAVA基础--面向对象--2022年8月23日
    第一节 面向对象概述、注意事项1、类和对象是什么?类:共同特征的描述(设计图)对象:是真实存在的具体案例2、如何设计类publicclass......
  • Java程序运行状态的监控
    写在前面:该系列文章,主要是为了深入学习Java完成的一条链,推荐阅读的整体顺序为:Java的内存模型(根源),一个java文件被执行的历程,一个Java类的加载,Java的垃圾回收机制及算法,Linu......
  • java后端面试题
    1.抽象类和接口的区别(三张思维导图教您更高效学习SSM框架)抽象类可以有构造方法,接口中不能有构造方法。抽象类中可以有普通成员变量,接口中没有普通成员变量。抽象类中可以......
  • java进制标识
    java进制标识二进制0b八进制0十六进制0xinti=010;//八进制08inti1=0x10;//十六进制16 ......
  • 在线编辑器粘贴图片自动上传到服务器(Java版)
    ​ tinymce是很优秀的一款富文本编辑器,可以去官网下载。https://www.tiny.cloud这里分享的是它官网的一个收费插件powerpaste的旧版本源码,但也不影响功能使用。umedit......
  • java数据类型转换问题
    我们知道java中的各个数据类型的取值范围不同,可以理解成容量大小,而针对容量大小可以对他们进行一个由低到高的排序,也就是优先级。优先级低-----------------------------......
  • oracle数据库性能监控常用sql
    因执行时间较长建议使用plsql等第三方工具执行--1.监控sga内存分配信息select*fromv$sgainfo;--2.监控每个用户的磁盘io及io命中率selectv$sess_io.*,(block_gets+con......
  • 04.Javascript学习笔记3
    1.箭头函数箭头函数是一种更短的函数表达式。constage=birthyear=>2022-birthyear;console.log(age(2000))箭头左边的birthyear是参数,箭头右边是要执行的代码......
  • java生成sql文件
    java生成sql文件java生成sql文件场景场景用于清理数据库数据,生成sql语句脚本,方便DBA执行@RequestMapping("/cleanQuestion")@ResponseBodypub......