Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java SecureRandom类创建随机密码_Java_Security_Random_Passwords - Fatal编程技术网

使用java 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

这是我第一次使用java.security.SecureRandom,我希望有人对下面的代码进行评论,以确保我的操作正确。该代码应该生成任意长度的加密安全随机密码。如有任何意见,将不胜感激

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())
会给你稍微好一点的随机性,因为模往往会得到稍微低一点的数字(好的,非常轻微)更频繁。文档讨论了它。