加密解密BASE64
由于MD5和SHA256加密是不可逆的,但是我们加密后又想要解密可以使用BASE64
这里我们选择的是Bases4是jdk自带的
package com.sun.org.apache.xerces.internal.impl.dv.util;
解析:
Base64加密调用的是
* public static String encode(byte[] binaryData)
Base64解密调用的是
* public static byte[] decode(String encoded)
这里解密返回的为什么是一个字节数组呢?
加密:
任何类型-------(转换成)------->字符串形式
解密
字符串像是-------(转换成)------->任何类型
在数据类型里面任何类型可以是byte[],所以这个就很容易理解了,参数为任何类型就是byte[],解密后返回的任何类型也可以进行转换。
加密
//Base64加密
public static String base64Encode(byte[] input){
/**
* Base64加密调用的是
* public static String encode(byte[] binaryData)
* 参数是一个字节数组
* 加密就是调用Base64里面的encode
* 这里使用反射
* Class.forName(全类名),这个里面需要使用完整的类名才可以
* Class clazz = Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");
* 接下来获取里面的加密方法
* clazz.getMethod(name, Class... parameterTypes),
* 加密方法是“encode”
* clazz.getMethod("encode", parameterTypes);
* 参数类型是byte[],byte[].class
* clazz.getMethod("encode", byte[].class);
* Method method = clazz.getMethod("encode", byte[].class);
* 获取到我们需要的方法后,接下来就是调用我们需要使用的方法
* method.invoke(obj, args)
* 正常情况下如果Person per = new Person()需要调用里面的sleep方法,per.sleep()
* 那么invoke这一步应该写成method.invoke(per, 参数)
* obj:调用的对象(谁调用这个方法),但是由于encode方法是一个静态方法,所以不需要对象调用
* args:传入的参数值,也就是最上面传入的input
* method.invoke(null, input)
*
* 调用encode方法后,有一个字符串返回值,返回的是加密的结果
* 所以这里需要提前定义一个结果字符串来接收返回值
* 但是由于method.invoke(null, input)invoke返回值是一个object
* 但是本质上是调用的encode,返回的是字符串,所以需要强转
* result = (String) method.invoke(null, input);
*/
String result= null;
try {
Class clazz = Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64")