发表于: 2020-08-13 23:03:52

1 1401


今天完成的事情:

1.使用DES对用户ID和登录时间加密和解密。

DES工具类


public class DESUtil {

    //字符编码格式

    private static final String CHARSET = "utf-8";

    /**

     * key的输入位数限制常量

     */

    private static final int LIMIT = 8;

    private static Logger logger = LoggerFactory.getLogger(DESUtil.class);

    /** 

     * 

     * @param mode    模式,解密或者加密

     * @param data    混淆条件,比如登录时间,用户id等

     * @param keyData 密码!

     * @return

     */

    public static byte[] des(int mode, byte[] data, byte[] keyData) {

        byte[] ret = null;

        if (data != null && keyData != null && keyData.length == 8) {

            try {

                // 获取Cipher对象,设置加密算法

                //使用Cipher进行加密,解密处理,需要创建实例对象并初始化。采用工厂模式创建对象

                Cipher cipher = Cipher.getInstance("DES");

                //生成key对象

                //DES加密算法使用DESKeySpec类,构造方法参数需要为8个字节的密码,也就是传入的keydata

                DESKeySpec desKeySpec = new DESKeySpec(keyData);

                //转换成key对象

                SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

                SecretKey key = keyFactory.generateSecret(desKeySpec);

                //设置Cipher模式,解密或者加密

                cipher.init(mode, key);

                //返回加密结果,参数为加密内容

                ret = cipher.doFinal(data);

            } catch (NoSuchAlgorithmException e) {

                e.printStackTrace();

            } catch (NoSuchPaddingException e) {

                e.printStackTrace();

            } catch (IllegalBlockSizeException e) {

                e.printStackTrace();

            } catch (BadPaddingException e) {

                e.printStackTrace();

            } catch (InvalidKeySpecException e) {

                e.printStackTrace();

            } catch (InvalidKeyException e) {

                e.printStackTrace();

            }

        }

        return ret;

    }

    /**

     * DES加密

     */

    public static String desEncrypt(String data, String keydata) {

        if (keydata == null || keydata.length() < LIMIT) {

            throw new RuntimeException("加密失败,key不能小于8位");

        }

        //如果混淆对象为空就返回空

        if (data == null) {

            return null;

        }

        try {

            //将传入的字符串类型加密数据和使用的Key转换为byte数组

            byte[] dataByte = data.getBytes(CHARSET);

            byte[] keyByte = keydata.getBytes(CHARSET);

            //返回的结果

            byte[] dataResult = des(Cipher.ENCRYPT_MODE, dataByte, keyByte);

            //new String返回字符串

            //Base64用于传输8Bit字节码

            return new String(Base64.getMimeEncoder().encode(dataResult));

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

            return data;

        }

    }

    /**

     * DES解密

     */

    public static String desDecrypt(String data, String keydata) {

        if (keydata == null || keydata.length() < LIMIT) {

            throw new RuntimeException("解密失败,key不能小于8位");

        }

        if (data == null) {

            return null;

        }

        try {

            byte[] dataByte = data.getBytes(CHARSET);

            byte[] keyByte = keydata.getBytes(CHARSET);

            byte[] dataResult = des(Cipher.DECRYPT_MODE, Base64.getMimeDecoder().decode(dataByte), keyByte);

            return new String(dataResult, CHARSET);

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

            return data;

        }

    }

}

PS:

javadoc 介绍:

此类为加密和解密提供密码功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心。

创建Cipher 对象:

通过Cipher.getInstance("str")  ,传入的值有两种情况:1.算法名称 2.算法/模式/填充

cipher类常量,

我们一般接触发到的就是两个:

ENCRYPT_MODE 表明是此时是加密模式,DECRYPT_MODE 表明此时是解密模式

类方法:

1.getInstance("str");通过传入算法名称,生成对应的cipher对象

2.doFinal();结束多部分加密或解密操作

3.doFinal(多参数);有几个重载方法,结束单部分或(多部分)加解密操作

4.init(); 初始化cipher对象,有多个重载方法,根据传入参数不同进行重载

测试:

@Test
public void testDES(){
User user=new User();
   user.setId(1);
   User user1=userService.findUser(user);
   String token = DESUtil.desEncrypt(user1.getId()+","+ new Date().getTime(),"12345678");

   System.out.println("加密后:"+token);
   try {
String decryResult = DESUtil.desDecrypt(token,"12345678");
       System.out.println("解密后:"+new String(decryResult));
   } catch (Exception e1) {
e1.printStackTrace();
   }
}

结果:

明天计划的事情:

使用jjwt生成token。

md5加密。
遇到的问题:
收获:


返回列表 返回列表
评论

    分享到