I am trying to generate OTP with following specific conditions:
- OTP must have at least 1 lower case character.
- OTP must have at least 1 upper case character
- OTP must have at least must have 1 or 2 number
- OTP length should be 8 character.
I tried following ways
import java.security.SecureRandom;
import org.apache.commons.lang3.RandomStringUtils;
public class TestJava {
public static void main(String []args){
char[] allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();
SecureRandom random = new SecureRandom();
int SIZE = 8;
// Try- 1
String opt1 = RandomStringUtils.random(SIZE, 0, 0, true, true, allowedChars, random);
// Try - 2
String opt2 = RandomStringUtils.randomAlphanumeric(8);
// Try - 3
String opt3 = RandomStringUtils.random(8, true, true);
}
}
Also tried solutions from https://www.techiedelight.com/generate-random-alphanumeric-password-java/
But after 4-5 tries it is generating password without number(s), i.e. condition 3 is not satisfying.
So can you please let me know how can I achieve given functionality. Thanks.
Advertisement
Answer
Could try the following and have a generated string within given condition.
Some further optimization on code can be done also, but notice every character have a fair probability of occurrence after mandatory condition are achieved (except length which is stop condition)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class RandomStr
{
public static void main(String args[])
{
RandomStr r = new RandomStr();
for(int i=0;i<10;i++)
System.out.println(r.new MyRandom().getRandom());
}
class MyRandom
{
char[] upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
char[] lower = "abcdefghijklmnopqrstuvwxyz".toCharArray();
int Size = 8;
public String getRandom()
{
String str="";
boolean flag= true;
while(flag)
{
if(str.length()<2 && flag==true)
{
str+=(int)(10*Math.random());
flag = ((int)(2*Math.random())==1) ? true : false;
}
else
{
flag = false;
}
}
str += upper[(int)(upper.length*Math.random())];
str += lower[(int)(lower.length*Math.random())];
while(str.length()<8)
str+= ((int)(2*Math.random())==1) ? upper[(int)(upper.length*Math.random())] : lower[(int)(upper.length*Math.random())];
//reorder string
List<Character> list= new ArrayList<Character>();
char[] cList= str.toCharArray();
for(int i=0;i<cList.length;i++)
list.add(cList[i]);
Collections.shuffle(list);
str="";
for(char c: list)
{
str+=c;
}
return str;
}
}
}
Output:
7OROFjHM 3Sn2jlki QsTf6IYB Ps09QrbN 93OdRlOX 6JBSdjdk mg4Qtk0J Dp31nHJQ RrDnkYH5 Ik4ed3se