使用java SecureRandom类创建随机密码
这是我第一次使用java.security.SecureRandom,我希望有人对下面的代码进行评论,以确保我的操作正确。该代码应该生成任意长度的加密安全随机密码。如有任何意见,将不胜感激使用java SecureRandom类创建随机密码,java,security,random,passwords,Java,Security,Random,Passwords,这是我第一次使用java.security.SecureRandom,我希望有人对下面的代码进行评论,以确保我的操作正确。该代码应该生成任意长度的加密安全随机密码。如有任何意见,将不胜感激 import java.util.*; import java.security.SecureRandom; public class PassGen{ private static final String VALID_PW_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ
import java.util.*;
import java.security.SecureRandom;
public class PassGen{
private static final String VALID_PW_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+{}[]|:;<>?,./";
private static final int DEFAULT_PASSWORD_LENGTH = 12;
private static final Random RANDOM = new SecureRandom();
// main class
public static void main(String args[]) throws Exception {
// Set password length
int pwLength;
if (args.length < 1)
pwLength = DEFAULT_PASSWORD_LENGTH;
else
pwLength = Integer.parseInt(args[0]);
// generate password
String pw = "";
for (int i=0; i<pwLength; i++) {
int index = (int)(RANDOM.nextDouble()*VALID_PW_CHARS.length());
pw += VALID_PW_CHARS.substring(index, index+1);
}
System.out.println("pw = " + pw);
}
}
import java.util.*;
导入java.security.SecureRandom;
公共类密码{
私有静态最终字符串有效_PW_CHARS=“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyz012456789!@$%^&*()-=+{}[]|:;?,./”;
私有静态最终整数默认密码长度=12;
private static final Random=new SecureRandom();
//主类
公共静态void main(字符串args[])引发异常{
//设置密码长度
整数长度;
如果(参数长度<1)
pwLength=默认密码长度;
其他的
pwLength=Integer.parseInt(args[0]);
//生成密码
字符串pw=“”;
对于(int i=0;i使用StringBuilder
而不是反复连接字符串。此外,您还应该考虑使用string.charAt(index)
而不是对单个字符使用子字符串:
import java.util.*;
import java.security.SecureRandom;
public class PassGen{
private static final String VALID_PW_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+{}[]|:;<>?,./";
private static final int DEFAULT_PASSWORD_LENGTH = 12;
private static final Random RANDOM = new SecureRandom();
// main class
public static void main(String args[]) throws Exception {
// Set password length
int pwLength;
if (args.length < 1)
pwLength = DEFAULT_PASSWORD_LENGTH;
else
pwLength = Integer.parseInt(args[0]);
StringBuilder pw = new StringBuilder();
// generate password
for (int i=0; i<pwLength; i++) {
int index = RANDOM.nextInt(VALID_PW_CHARS.length());
pw.append(VALID_PW_CHARS.charAt(index)));
}
System.out.println("pw = " + pw.toString());
}
}
import java.util.*;
导入java.security.SecureRandom;
公共类密码{
私有静态最终字符串有效_PW_CHARS=“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyz012456789!@$%^&*()-=+{}[]|:;?,./”;
私有静态最终整数默认密码长度=12;
private static final Random=new SecureRandom();
//主类
公共静态void main(字符串args[])引发异常{
//设置密码长度
整数长度;
如果(参数长度<1)
pwLength=默认密码长度;
其他的
pwLength=Integer.parseInt(args[0]);
StringBuilder pw=新的StringBuilder();
//生成密码
对于(int i=0;i,您可以使用org.apache.commons.lang.RandomStringUtils()使用char数组和java.security.SecureRandom生成密码:
public String generatePassword()
{
return RandomStringUtils.random(DEFAULT_PASSWORD_LENGTH, 0, VALID_PW_CHARS.length(), false,
false, VALID_PW_CHARS.toCharArray(), new SecureRandom());
}
在pom.xml中
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
org.apache.commons
commons-lang3
3.4
对工作代码的审查与SO无关。这里有一个单独的网站:如果您的代码中有特定的问题,请确定它,以便我们可以帮助解决。@DavisBroda如果您运行它,该代码不会运行-这里有一个特定的问题,OP只是问了一个很糟糕的问题。@John这与代码本身无关,并且更多的是问题的措辞。这里没有实际的问题,除了“这个有用吗?”。事实上,他的问题似乎更多的是关于检查他正在使用的算法,而不是任何特定的错误。无论代码是否正确运行,讨论的重点都不在主题上。他应该发布代码检查,询问算法/最佳实践,或者发布关于特定错误的问题。@DavisBroda,好的,到在CR主题上,代码必须尽OP所知工作。因此,在代码审查中询问“此代码工作吗”是非主题。请参阅CR的复习-询问“关于X的最佳实践是什么”在CR.@DavisBroda上也是离题的-我想我的问题的关键是我是否正确使用了SecureRandom类来生成加密安全的随机密码。如果这个问题更适合codereview.stackexchange.com,那么如果我浪费了任何人的时间,我道歉。我不认为使用random.nextDouble()
在这里是一个好主意,因为你会得到0到1之间的数字,所以一旦你执行mod操作,你每次都会选择“a”,导致像“AAAAAA”这样的密码。相反,尝试执行类似于RANDOM.nextInt(VALID_PW_CHARS.length())的操作
编写的代码实际上可以工作,因为它给我的是带有各种字符的完全随机字符串。@neuronaut-对不起,我刚刚意识到你是在用random引用John的代码。nextInt(VALID\u PW\u CHARS.length())
会给你稍微好一点的随机性,因为模往往会得到稍微低一点的数字(好的,非常轻微)更频繁。文档讨论了它。