Yblsfls
2017-09-13 09:04
采纳率: 66.7%
浏览 3.0k
已采纳

java加密,密文长度可以小于等于明文长度吗?

目前遇到一个问题,需要把数据库中所有涉及到身份证号的表的字段从明文变成密文,但是表设计的时候身份证号码字段长度只有18位,有没有办法可以在不改变表接口(需要改动的表太多了)然后储存密文,并且密文是可以反解的

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

10条回答 默认 最新

  • dl0246 2017-09-13 13:57
    已采纳

    分享一段之前写的简单编码和解码代码,给你点提示,首先可以肯定的是你的需求可以做到!
    若需要解码代码,请跟我留言。

     /**
           * 简单的字符穿编码
           **/
          public static String encode(String ss,String enc)
          {
            StringBuffer sb=new StringBuffer("");
            int x=0;
            for (int i=0;i<ss.length();i++)
            {
              int z=ss.charAt(i)^enc.charAt(x);
              x++;
              if (x>=enc.length()) x=0;
              if (i>0) sb.append('|');
              sb.append(Long.toHexString(z));
            }
            return sb.toString();
          }
    
    已采纳该答案
    打赏 评论
  • 你做身份证插入的时候就应该加密了,你的数据库的字段长度不限制都行,在插入身份证的时候判断是不是15位或者18位,然后进行加密操作,插入数据库,读取的时候自然要用到解密。

    打赏 评论
  • oyljerry 2017-09-13 09:07

    没有,变短了的,一般不能支持反解了。

    打赏 评论
  • 闪现送五杀 2017-09-13 09:31

    可以,比较是用加密后的比,解密一般会有些问题

    打赏 评论
  • 举头三尺有宋浩 2017-09-13 09:36

    可以的 你可以这样 把身份证长度 两位两位分成一组 然后转成16进制 或者更高的进制

    打赏 评论
  • liu1823612484 2017-09-13 10:25

    可以的,只不过解密的时候会出现问题

    打赏 评论
  • 小飞鱼002 2017-09-13 11:40

    可以的,只要把加解密的规则定义清楚就行,最简单的比如大写变小写之类 肯定长度不变,当然可以定义比较复杂的规则

    打赏 评论
  • 卓成俊 2017-09-13 13:40

    你可以把省份正分2组,1-17位是数字(为一组),最后一位可能是数字或者X(为一组),然后把第一组转成16进制,你只需要加密第一组就可以了。
    比如身份证44088219940705278X
    44088219940705278 转成16进制 9ca200a0585400 假如加密(加密算法可以自己定义)后 ,变成 09fgfse438sjc
    最后保存到数据库中 是 09fgfse438sjcX

    然后你返回到客户端的时候,再逆向操作就行。

    打赏 评论
  • IAmObject 2017-09-14 01:20

    简单的加密就可以了。0对应A 1对应B 依次类推。X不变不就可以了,

    打赏 评论
  • Yblsfls 2017-11-22 06:15

    过了好久才发现有这么多回答了,可惜当时都没注意。
    后来的解决方案是使用aop在service层insert和update时候去除idno字段的值进行加密(加密方法任意选),然后将加密结果存到新建表中,字段多长都行。原先身份证字段改成加密表的外键。select的时候查到新建表的加密值进行解密。

    1 打赏 评论

相关推荐 更多相似问题