Java隨機(jī)字符串與簡(jiǎn)單加密工具類詳解
我們都知道Java有一些自帶的Random類,不過我們也可以簡(jiǎn)單的自己封裝成工具類,然后用在我們項(xiàng)目ID,驗(yàn)證碼,以及訂單中。
我們也可以自己寫一個(gè)簡(jiǎn)單的md5和sha加密工具類來加密一些數(shù)字密碼
一、隨機(jī)工具類
1.創(chuàng)建RandomUtils類
我們來新建一個(gè)隨機(jī)工具類吧,命名為 RandomUtils,其中包含了各種返回定長(zhǎng)隨機(jī)字符串的方法,也可以根據(jù)想要返回的字母或數(shù)字類型來調(diào)用相應(yīng)的方法
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";
/**
* 生成定長(zhǎng)隨機(jī)字符串(數(shù)字)
*
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
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();
}
/**
* 生成定長(zhǎng)隨機(jī)字符串(大小寫字母、數(shù)字)
*
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
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();
}
/**
* 生成定長(zhǎng)隨機(jī)字符串(只包含大小寫字母)
*
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
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();
}
/**
* 生成定長(zhǎng)隨機(jī)字符串(只包含小寫字母)
*
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
public static String generateRandomLower(int length) {
return generateRandomEng(length).toLowerCase();
}
/**
* 生成定長(zhǎng)隨機(jī)字符串(只包含大寫字母)
*
* @param length 隨機(jī)字符串長(zhǎng)度
* @return 隨機(jī)字符串
*/
public static String generateRandomUpper(int length) {
return generateRandomEng(length).toUpperCase();
}
/**
* 生成定長(zhǎng)純0字符串
*
* @param length 字符串長(zhǎng)度
* @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();
}
/**
* 根據(jù)數(shù)字生成定長(zhǎng)字符串,長(zhǎng)度不夠前面補(bǔ)0
*
* @param num 數(shù)字
* @param len 字符串長(zhǎng)度
* @return 定長(zhǎng)的字符串
*/
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("將數(shù)字" + num + "轉(zhuǎn)化為長(zhǎng)度為" + len + "時(shí)發(fā)生異常!");
}
sb.append(strNum);
return sb.toString();
}
/**
* 傳入數(shù)字,輸出每個(gè)位數(shù)都不相同的字符串
*
* @param param
* @return 定長(zhǎng)的數(shù)字
*/
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("數(shù)組長(zhǎng)度小于輸出長(zhǎng)度,一定會(huì)有重復(fù),這是個(gè)異常!");
}
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.測(cè)試方法
public static void main(String[] args) {
System.out.println("定長(zhǎng)隨機(jī)數(shù)字:" + generateRandomNumber(10));
System.out.println("定長(zhǎng)隨機(jī)大小寫字母加數(shù)字:" + generateRandomNumStr(10));
System.out.println("定長(zhǎng)隨機(jī)大小寫字母:" + generateRandomEng(10));
System.out.println("定長(zhǎng)隨機(jī)大寫字母:" + generateRandomUpper(10));
System.out.println("定長(zhǎng)隨機(jī)小寫字母:" + generateRandomLower(10));
System.out.println("定長(zhǎng)全0字符串:" + generateZeroString(10));
System.out.println("定長(zhǎng)補(bǔ)0字符串:" + generateZeroPadding(9527, 10));
int[] ints01 = {1, 2, 3};
System.out.println("每個(gè)位數(shù)都不相同:" + getNotRepeatString(ints01, 3));
System.out.println("UUID-1:" + getUUID());
System.out.println("UUID-2:" + getUUID());
}
我們來看一下輸出結(jié)果

二、加密工具類
1.創(chuàng)建EncryptUtils類
這里是一個(gè)簡(jiǎn)單的加密工具類命名為 EncryptUtils,我看到了網(wǎng)上有好多好多種加密的方法,不過大家覺得下面的簡(jiǎn)單的夠用的話那就可以了
package cn.liu783.vueappjava.myutil;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class EncryptUtils {
/**
* 加密
*
* @param inputText 要加密的內(nèi)容
* @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;
}
/**
* 返回十六進(jìn)制
*/
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.測(cè)試加密方法
來分別調(diào)用一下md5和sha看一下不同的加密結(jié)果
public static void main(String[] args) {
// md5加密測(cè)試
String md5_1 = md5("123456");
// sha加密測(cè)試
String sha_1 = sha("123456");
// 二次加密
String res = twoMd5Sha("123456");
System.out.println("sha加密:" + sha_1 + "\nmd5加密:" + md5_1 + "\n二次加密:" + res);
}
看一下結(jié)果吧

總結(jié)
以上這些代碼其實(shí)都是挺簡(jiǎn)單的,我們以后也可以慢慢來做些更加復(fù)雜的處理。
這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Gradle構(gòu)建多模塊項(xiàng)目的方法步驟
這篇文章主要介紹了Gradle構(gòu)建多模塊項(xiàng)目的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
SpringBoot對(duì)Jar包進(jìn)行加密的示例代碼
在當(dāng)今互聯(lián)網(wǎng)高速發(fā)展的時(shí)代,軟件安全問題變得尤為突出,隨著開源技術(shù)的普及,Spring Boot等框架的應(yīng)用越來越廣泛,但也伴隨著代碼被反編譯的風(fēng)險(xiǎn),本文將探討在Spring Boot項(xiàng)目中對(duì)Jar包進(jìn)行加密,以防止反編譯的安全實(shí)踐,需要的朋友可以參考下2023-12-12
SpringBoot中的響應(yīng)式web應(yīng)用詳解
這篇文章主要介紹了SpringBoot中的響應(yīng)式web應(yīng)用詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
JAVA將中文轉(zhuǎn)換為拼音簡(jiǎn)單實(shí)現(xiàn)方法
拼音轉(zhuǎn)換是中文處理的常見需求,TinyPinyin、HanLP、pinyin4j是常用的本地拼音轉(zhuǎn)換庫(kù),各有特點(diǎn),開發(fā)者可根據(jù)具體需求選擇合適的拼音轉(zhuǎn)換工具,需要的朋友可以參考下2024-10-10
IDEA編譯時(shí)報(bào)常量字符串過長(zhǎng)的解決辦法
本文主要介紹了IDEA編譯時(shí)報(bào)常量字符串過長(zhǎng)的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

