序列化加密/反序列化解密

序列化/反序化

  • 方便读写java中的任何对象(该对象需要实现Serializable

  • 若没有继承Serializable,写出时会抛出异常,java.io.NotSerializableException 没有实现序列化接口

  • 实现Serializable接口后,通常要指定版本号(不指定时自动生成)

  • 反序列化的对像与当前版本一致 那么反序列化必定成功,哪怕类结构发生改变,凡是可用属性还是会还原

  • 版本号不同时反序列化必定失败

  • transient关键字修饰的变量和静态变量不会写出

  • 继承父类成员变量时,父类需要实现Serializable接口才能还原数据

  • 引用变量必须实现Serializable接口否则会抛出异常,null时除外

利用反射完成加密和解密

try {
    String str="111";
    Class kgc =KeyGenerator.class;
    Method kgcm=kgc.getMethod("getInstance", String.class);
    Object kg=kgcm.invoke(kgc, "Desede");
    Method m= kgc.getMethod("generateKey");  //获取生成秘钥方法
    Object key=m.invoke(kg);        //获取秘钥
    System.out.println("密钥获取成功");
    Class cc=Cipher.class;
    m=cc.getMethod("getInstance",String.class);
    Object c=m.invoke(cc,"Desede");     //锁实例
    System.out.println("锁获取成功");
    m=cc.getMethod("init",int.class,Key.class);


    m.invoke(c,cc.getField("ENCRYPT_MODE").get(cc),key);  //初始化锁
    System.out.println("锁初始化成功");
    Class soc=SealedObject.class;
    Object so=soc.getConstructor(Serializable.class,cc).newInstance(str,c); //获取上的盒子
    System.out.println("获取盒子成功");

    Class oosc=ObjectOutputStream.class;
    Class fosc=FileOutputStream.class;
    Object fos=fosc.getConstructor(String.class).newInstance("str.data"); //获取字节流
    Object oos=oosc.getDeclaredConstructor(OutputStream.class).newInstance(fos);
    oosc.getMethod("writeObject", Object.class).invoke(oos, so);
    System.out.println("成功写出");

    Class oisc=ObjectInputStream.class;
    Class fisc=FileInputStream.class;
    Object fis=fisc.getConstructor(String.class).newInstance("str.data");
    Object ois=oisc.getConstructor(InputStream.class).newInstance(fis);
    Object sor=oisc.getMethod("readObject").invoke(ois);
    System.out.println("成功获取盒子");

    Object ostr=soc.getMethod("getObject",Key.class).invoke(sor, key);
    System.out.println(ostr);
} catch (Exception e) {
    e.printStackTrace();
}   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值