Java随机字符串与简单加密工具类详解

 更新时间:2023年11月01日 09:30:06   作者:LauSET  
这篇文章主要介绍了Java随机字符串与简单加密工具类,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

我们都知道Java有一些自带的Random类,不过我们也可以简单的自己封装成工具类,然后用在我们项目ID,验证码,以及订单中。

我们也可以自己写一个简单的md5和sha加密工具类来加密一些数字密码

一、随机工具类

1.创建RandomUtils类

我们来新建一个随机工具类吧,命名为 RandomUtils,其中包含了各种返回定长随机字符串的方法,也可以根据想要返回的字母或数字类型来调用相应的方法

package cn.liu783.vueappjava.myutil;

import java.util.Random;
import java.util.UUID;

public class RandomUtils {

    public static final String CHAR_ALL = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public static final String CHAR_ENG = "abcdefghijkllmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public static final String CHAR_NUM = "0123456789";

    /**
     * 生成定长随机字符串(数字)
     *
     * @param length 随机字符串长度
     * @return 随机字符串
     */
    public static String generateRandomNumber(int length) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            sb.append(CHAR_NUM.charAt(new Random().nextInt(CHAR_NUM.length())));
        }
        return sb.toString();
    }

    /**
     * 生成定长随机字符串(大小写字母、数字)
     *
     * @param length 随机字符串长度
     * @return 随机字符串
     */
    public static String generateRandomNumStr(int length) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            sb.append(CHAR_ALL.charAt(new Random().nextInt(CHAR_ALL.length())));
        }
        return sb.toString();
    }

    /**
     * 生成定长随机字符串(只包含大小写字母)
     *
     * @param length 随机字符串长度
     * @return 随机字符串
     */
    public static String generateRandomEng(int length) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            sb.append(CHAR_ENG.charAt(new Random().nextInt(CHAR_ENG.length())));
        }
        return sb.toString();
    }

    /**
     * 生成定长随机字符串(只包含小写字母)
     *
     * @param length 随机字符串长度
     * @return 随机字符串
     */
    public static String generateRandomLower(int length) {
        return generateRandomEng(length).toLowerCase();
    }

    /**
     * 生成定长随机字符串(只包含大写字母)
     *
     * @param length 随机字符串长度
     * @return 随机字符串
     */
    public static String generateRandomUpper(int length) {
        return generateRandomEng(length).toUpperCase();
    }

    /**
     * 生成定长纯0字符串
     *
     * @param length 字符串长度
     * @return 纯0字符串
     */
    public static String generateZeroString(int length) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            sb.append('0');
        }
        return sb.toString();
    }

    /**
     * 根据数字生成定长字符串,长度不够前面补0
     *
     * @param num 数字
     * @param len 字符串长度
     * @return 定长的字符串
     */
    public static String generateZeroPadding(long num, int len) {
        StringBuffer sb = new StringBuffer();
        String strNum = String.valueOf(num);
        if (len - strNum.length() >= 0) {
            sb.append(generateZeroString(len - strNum.length()));
        } else {
            throw new RuntimeException("将数字" + num + "转化为长度为" + len + "时发生异常!");
        }
        sb.append(strNum);
        return sb.toString();
    }

    /**
     * 传入数字,输出每个位数都不相同的字符串
     *
     * @param param
     * @return 定长的数字
     */
    public static int getNotRepeatString(int[] param, int len) {
        for (int i = param.length; i > 1; i--) {
            int index = new Random().nextInt(i);
            int tmp = param[index];
            param[index] = param[i - 1];
            param[i - 1] = tmp;
        }
        int result = 0;
        if (param.length >= len) {
            for (int i = 0; i < len; i++) {
                result = result * 10 + param[i];
            }
        } else {
            throw new RuntimeException("数组长度小于输出长度,一定会有重复,这是个异常!");
        }
        return result;
    }

    /**
     * 获取UUID字符串,去除横杠
     */
    public static String getUUID(){
        String s = UUID.randomUUID().toString();
        return s.substring(0,8)+s.substring(9,13)+s.substring(14,18)+s.substring(19,23)+s.substring(24);
    }

}

2.测试方法

	public static void main(String[] args) {

        System.out.println("定长随机数字:" + generateRandomNumber(10));
        System.out.println("定长随机大小写字母加数字:" + generateRandomNumStr(10));
        System.out.println("定长随机大小写字母:" + generateRandomEng(10));
        System.out.println("定长随机大写字母:" + generateRandomUpper(10));
        System.out.println("定长随机小写字母:" + generateRandomLower(10));
        System.out.println("定长全0字符串:" + generateZeroString(10));
        System.out.println("定长补0字符串:" + generateZeroPadding(9527, 10));
        int[] ints01 = {1, 2, 3};
        System.out.println("每个位数都不相同:" + getNotRepeatString(ints01, 3));
        System.out.println("UUID-1:" + getUUID());
        System.out.println("UUID-2:" + getUUID());

    }

我们来看一下输出结果


二、加密工具类

1.创建EncryptUtils类

这里是一个简单的加密工具类命名为 EncryptUtils,我看到了网上有好多好多种加密的方法,不过大家觉得下面的简单的够用的话那就可以了

package cn.liu783.vueappjava.myutil;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class EncryptUtils {

    /**
     * 加密
     *
     * @param inputText 要加密的内容
     * @param algorithmName 加密算法名称:md5,sha-1
     * @return
     */
    private static String encrypt(String inputText, String algorithmName) {
        if (inputText == null || "".equals(inputText.trim())) {
            throw new IllegalArgumentException("密码不能为空");
        }
        if (algorithmName == null || "".equals(algorithmName.trim())) {
            algorithmName = "md5";
        }
        String encryptText = null;
        try {
            MessageDigest m = MessageDigest.getInstance(algorithmName);
            m.update(inputText.getBytes("UTF8"));
            byte s[] = m.digest();
            // m.digest(inputText.getBytes("UTF8"));
            return getHex(s);
        } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return encryptText;
    }

    /**
     * 返回十六进制
     */
    private static String getHex(byte[] arr) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < arr.length; ++i) {
            sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100).substring(1, 3));
        }
        return sb.toString();
    }

    /**
     * 二次加密
     */
    public static String twoMd5Sha(String inputText) {
        return sha(md5(inputText));
    }

    /**
     * md5加密
     */
    public static String md5(String inputText) {
        return encrypt(inputText, "md5");
    }

    /**
     * sha加密
     */
    public static String sha(String inputText) {
        return encrypt(inputText, "sha-1");
    }

}

2.测试加密方法

来分别调用一下md5和sha看一下不同的加密结果

	public static void main(String[] args) {
        // md5加密测试
        String md5_1 = md5("123456");
        // sha加密测试
        String sha_1 = sha("123456");
        // 二次加密
        String res = twoMd5Sha("123456");

        System.out.println("sha加密:" + sha_1 + "\nmd5加密:" + md5_1 + "\n二次加密:" + res);
    }

看一下结果吧

总结

以上这些代码其实都是挺简单的,我们以后也可以慢慢来做些更加复杂的处理。

这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java详细介绍单例模式的应用

    Java详细介绍单例模式的应用

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
    2022-09-09
  • Java 使用反射调用jar包中的类方式

    Java 使用反射调用jar包中的类方式

    这篇文章主要介绍了Java 使用反射调用jar包中的类方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • springboot 如何重定向redirect 并隐藏参数

    springboot 如何重定向redirect 并隐藏参数

    这篇文章主要介绍了springboot 如何重定向redirect 并隐藏参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java8中字符串处理库strman-java的使用示例

    Java8中字符串处理库strman-java的使用示例

    除了Java本身的字符串处理方式外,我们还可以使用Apache Common Langs里的StringUtils来简化String的操作。但以上两种方式对于我们日常编程中最容易碰到的字符串处理来说,仍然显得有些不足。所以这篇文章给大家介绍Java8中字符串处理库strman-java的使用。
    2016-09-09
  • Mybatis-Plus中getOne方法获取最新一条数据的示例代码

    Mybatis-Plus中getOne方法获取最新一条数据的示例代码

    这篇文章主要介绍了Mybatis-Plus中getOne方法获取最新一条数据,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Java发展史之Java由来

    Java发展史之Java由来

    本文主要给大家简单讲解了一下java的发展史,详细说明了java的由来以及如何一步步发展起来的,想了解的小伙伴可以来参考下
    2016-10-10
  • 解决idea启动报错javax.imageio.IIOException的问题

    解决idea启动报错javax.imageio.IIOException的问题

    这篇文章主要介绍了idea启动报错javax.imageio.IIOException,解决打不开idea问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 解决SpringBoot中使用@Transactional注解遇到的问题

    解决SpringBoot中使用@Transactional注解遇到的问题

    这篇文章主要介绍了SpringBoot中使用@Transactional注解遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring事务中的事务传播行为使用方式详解

    Spring事务中的事务传播行为使用方式详解

    Spring框架作为一个轻量级的开源框架,在企业应用开发中被广泛使用,在Spring事务管理中,事务传播行为是非常重要的一部分,它定义了方法如何参与到已经存在的事务中或者如何开启新的事务,本文将详细介绍Spring事务中的几种事务传播行为,详细讲解具体使用方法
    2023-06-06
  • java实现单链表、双向链表

    java实现单链表、双向链表

    这篇文章主要为大家详细介绍了java实现单链表、双向链表的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-03-03

最新评论