Java随机字符串与简单加密工具类详解
作者: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); }
看一下结果吧
总结
以上这些代码其实都是挺简单的,我们以后也可以慢慢来做些更加复杂的处理。
这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。