mycat-encrypt-server如何支持模糊查询的

最近在研究数据库加密,看到了mycat-encrypt-server项目,看了一下代码,说是支持加密字段的模糊查询:

private void parserBinaryExpression(Expression expression, Set<String> columns, String tableAlias, String tableName) {
   BinaryExpression binartex = (BinaryExpression) expression;
   Expression leftExpression = binartex.getLeftExpression();
   if (leftExpression instanceof Column) {
      Column column = (Column) leftExpression;
      String columnTable = column.getTable() == null ? null : column.getTable().getName().toLowerCase().replaceAll("`", "");
      String columnName = column.getColumnName().toLowerCase().replaceAll("`", "");
      if (columns.contains(columnName)) {
         if (isNotOwn(tableAlias, tableName, columnTable)) {
            return;
         }
         //如果是需要加密的列,获取右边
         Expression rightExpression = binartex.getRightExpression();
         if ((binartex instanceof EqualsTo || binartex instanceof NotEqualsTo) && rightExpression instanceof StringValue) {
            StringValue value = (StringValue) rightExpression;
            //如果是相等
            if (StringUtils.isNotEmpty(value.getValue())) {
               value.setValue(EncryptHelper.hexWithPre(EncryptHelper.encode(value.getValue().getBytes(StandardCharsets.UTF_8))));
            }
         } else if (binartex instanceof LikeExpression && rightExpression instanceof StringValue) {
            //如果是like
            StringValue stringValue = (StringValue) rightExpression;
            String strVal = stringValue.getValue();
            String start = strVal.startsWith("%") ? "%" : EncryptHelper.PRE_ENCRYPT;
            String end = strVal.endsWith("%") ? "%" : "";
            String value = strVal.replaceAll("^%+|%+$", "");
            if (StringUtils.isNotEmpty(value)) {
               stringValue.setValue(start + EncryptHelper.hex(EncryptHelper.encode(value.getBytes(StandardCharsets.UTF_8))) + end);
            }
         }
      }
   }
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值