根據字元型別和密碼長度隨機生成密碼
原因
初衷:我本來是想寫根據自己定義的一些資訊生成複雜度可自選的固定密碼,增強密碼的複雜性的同時,也更容易記住密碼,這樣密碼即使明文記錄在本地,沒有自己的加密演算法,也得不到最終真正的密碼。我看到網上有一些現成的工具以及chrome的外掛等,還是想自己試試。
不過看到一些自動生成隨機密碼的網站,一好奇就先有了這篇隨機生成密碼的文章。
目標
可以選擇數字,小寫字母,大寫字母,特殊符號,密碼長度,根據這些選擇生成隨機的密碼。
思路
思路1: 我的思路其實很簡單粗暴,密碼組成可以有數字,小寫字母,大寫字母,特殊符號4種選擇,所以可以選擇其中的1種,2種,3種,4種組成密碼,分別對應的組合方式有4種,6種,4種,1種,其實就是簡單的排列組合。然後根據選擇了幾種字元種類,就生成和為密碼長度的幾個隨機數,然後到相應的字元種類中隨機選擇幾個字元,把他們拼接在一起,最後打亂組成新密碼。
例如:選擇數字和小寫字母組成長度為 10 的隨機密碼,程式會生成和為 10 的兩個隨機數,假設兩個隨機數是 4 和 6,則會從 0-9 十個數字和 a-z 26小寫字母中中隨機的選擇 4 個數字和 6 個字母,然後把他們拼接在一起,最後打亂順序就得到最終的隨機密碼。
我的想法很簡單,如果有更好的方法,求告知,謝謝!
思路2: 另一種生成隨機密碼的方法,先拼裝所有可能組成密碼的字元型別,然後隨機選擇指定長度的n個字元,然後拿著這n字元校驗是否包含選擇了的字元型別的字元和是否不包含沒有選擇的字元型別的字元,這樣不斷重試,直到找到符合選擇的字元型別字串為止。這種方法可能重試的次數比較多,實現參考: https://github.com/lynchnf/password
思路1程式碼實現
package fun;
import java.util.*;
/**
* Created by gary on 16/10/15.
*/
public class GeneratePassword {
private static String number = "0123456789";
private static String lowerChar = "abcdefghijklmnopqrstuvwxyz";
private static String upperChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static String specialChar = "*$%!:;.,?&(-_)=#{[@]}";
/**
* 四種字元十五種組合方式隨機產生密碼
* @param isNum
* @param isLowerChar
* @param isUpperChar
* @param isSpecialChar
* @param length
* @return
*/
private static String generPassword(boolean isNum, boolean isLowerChar, boolean isUpperChar, boolean isSpecialChar,
int length) {
String password = null;
// 只選一種
if (isNum && !(isLowerChar || isUpperChar || isSpecialChar))
return genPwByNum(1, length, number);
if (isLowerChar && !(isNum || isUpperChar || isSpecialChar))
return genPwByNum(1, length, lowerChar);
if (isUpperChar && !(isLowerChar || isNum || isSpecialChar))
return genPwByNum(1, length, upperChar);
if (isSpecialChar && !(isLowerChar || isUpperChar || isNum))
return genPwByNum(1, length, specialChar);
// 選擇了兩種
if ((isNum && isLowerChar) && !(isUpperChar || isSpecialChar))
return genPwByNum(2, length, number, lowerChar);
if ((isNum && isUpperChar) && !(isLowerChar || isSpecialChar))
return genPwByNum(2, length, number, upperChar);
if ((isNum && isSpecialChar) && !(isLowerChar || isUpperChar))
return genPwByNum(2, length, number, specialChar);
if ((isLowerChar && isUpperChar) && !(isNum || isSpecialChar))
return genPwByNum(2, length, lowerChar, upperChar);
if ((isLowerChar && isSpecialChar) && !(isNum || isUpperChar))
return genPwByNum(2, length, lowerChar, specialChar);
if ((isUpperChar && isSpecialChar) && !(isNum || isLowerChar))
return genPwByNum(2, length, upperChar, specialChar);
// 選擇了三種
if ((isNum && isLowerChar && isUpperChar) && !isSpecialChar)
return genPwByNum(3, length, number, lowerChar, upperChar);
if ((isNum && isLowerChar && isSpecialChar) && !isUpperChar)
return genPwByNum(3, length, number, lowerChar, specialChar);
if ((isNum && isUpperChar && isSpecialChar) && !isLowerChar)
return genPwByNum(3, length, number, upperChar, specialChar);
if ((isLowerChar && isUpperChar && isSpecialChar) && !isNum)
return genPwByNum(3, length, lowerChar, upperChar, specialChar);
// 四種都選
if (isNum && isLowerChar && isUpperChar && isSpecialChar)
return genPwByNum(4, length, number, lowerChar, upperChar, specialChar);
return password;
}
/**
* 根據選擇的字元型別生成密碼
* @param num
* @param length
* @param keys
* @return
*/
public static String genPwByNum(int num, int length, String... keys) {
StringBuilder stringBuilder = new StringBuilder();
if (length < num) {
return stringBuilder.append("length should be bigger than ").append(num - 1).toString();
}
int[] randArray = randArr(num, length);
int i = 0;
for (String str : keys)
stringBuilder.append(collectStr(randArray[i++], str));
return shuffleString(stringBuilder.toString());
}
/**
* 產生和為length的num個隨機數
* @param num
* @param length
* @return
*/
public static int[] randArr(int num, int length) {
Random random = new Random();
int[] randArray = new int[num];
int i = 0;
if (num == 1) {
randArray[i] = length;
} else {
while (num > 1) {
int rand = random.nextInt(length - num + 1) + 1;
randArray[i++] = rand;
length -= rand;
num--;
if (num == 1) {
randArray[i] = length;
}
}
}
for (int m : randArray) {
System.out.println(m);
}
return randArray;
}
/**
* 隨機拼裝字元
* @param length
* @param sample
* @return
*/
public static String collectStr(int length, String sample) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < length; i++) {
stringBuilder.append(sample.charAt((int) (Math.random() * sample.length())));
}
return stringBuilder.toString();
}
/**
* 打亂字串
* @param str
* @return
*/
public static String shuffleString(String str) {
StringBuilder stringBuilder = new StringBuilder();
List<String> list = Arrays.asList(str.split(""));
Collections.shuffle(list);
for (String s : list) {
stringBuilder.append(s);
}
return stringBuilder.toString();
}
public static void main(String[] args) {
String password = generPassword(true, true, true, true, 10);
System.out.println(password);
// randArr(4, 10);
}
}
相關文章
- JS生成隨機密碼JS隨機密碼
- Linux 生成隨機密碼Linux隨機密碼
- 使用mkpasswd生成隨機密碼隨機密碼
- Linux 隨機生成密碼mkpasswdLinux隨機密碼
- 案例四:Shell指令碼生成隨機密碼指令碼隨機密碼
- ruby指令碼,隨機生成複雜密碼指令碼隨機密碼
- javascript隨機生成字串,可以用來生成隨機密碼JavaScript隨機字串密碼
- linux 生成隨機密碼,uuidLinux隨機密碼UI
- PHP生成隨機密碼的幾種方法PHP隨機密碼
- mysql 5.7 初始化密碼或隨機密碼MySql密碼隨機
- Firefox 69 將加入隨機密碼生成器Firefox隨機密碼
- 直播軟體開發,隨機密碼生成器隨機密碼
- 關於根據USERNAME取密碼的問題密碼
- 密碼生成密碼
- Linux 生成複雜密碼並且檢查密碼強度Linux密碼
- Linux 系統生成隨機密碼的10種方法Linux隨機密碼
- 八種在 Linux 上生成隨機密碼的方法Linux隨機密碼
- Linux 命令列生成隨機密碼的十種方法Linux命令列隨機密碼
- 根據使用者名稱和密碼查詢使用者密碼
- MySQL 5.7 初始密碼和密碼複雜度問題MySql密碼複雜度
- java 之 給定固定長度根據字元長分割文件Java字元
- 如何得到一個隨機密碼隨機密碼
- 如何在 Linux 生成複雜密碼並且檢查密碼強度Linux密碼
- Linux系統自動隨機生成複雜密碼方法Linux隨機密碼
- 利用 Linux 系統生成隨機密碼的 10 種方法Linux隨機密碼
- PHP生成隨機密碼的4種方法及效能對比PHP隨機密碼
- 利用Linux系統生成隨機密碼的10種方法Linux隨機密碼
- jQuery實現的生成隨機密碼程式碼例項簡單介紹jQuery隨機密碼
- 3種生成高強度密碼的方法密碼
- 使用命令列生成高強度密碼命令列密碼
- python - 根據均值和標準差生成隨機整數Python隨機
- 淺議密碼強度與密碼破解(2)密碼
- 直播軟體原始碼,JS獲取指定長度的隨機字元原始碼JS隨機字元
- 生成密碼函式密碼函式
- 正規表示式驗證密碼格式和長度程式碼例項密碼
- linux自動修改密碼長度和有效期的指令碼Linux密碼指令碼
- 根據URL地址生成二維碼
- 根據api檔案生成程式碼API