Java中的SecureRandom类提供了加密安全的伪随机数生成器,其预期用途是对安全敏感的应用程序。 在此示例中,我们不会将其用于预期目的,而是在简单的密码生成器中介绍其方法。
1.使用安全随机数生成密码
我们为密码生成器制定的一个约定是,最终密码可以由大写字母AZ,小写字母az,数字0-9和符号#,$,%,&和@组成。
PasswordGenerator.java
package com.mkyong.passwordgen;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
public class PasswordGenerator {
private SecureRandom srand;
private ArrayList validch;
public PasswordGenerator() throws NoSuchAlgorithmException, NoSuchProviderException {
srand = new SecureRandom();
validch = new ArrayList<>();
//Filling the ArrayList with the characters we want to use based on ascii table:
// https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html
for (int i = 65; i < 91; i++) {
validch.add((char) i);// A-Z
validch.add((char) (i + 32));// a-z
}
for (int i = 48; i < 58; i++) {
validch.add((char) i);
}
for (int i = 35; i < 39; i++) {
validch.add((char) i);
}
validch.add((char) 64);
Collections.shuffle(validch);
}
public char randChar() {
return (char) this.validch.get(srand.nextInt(this.validch.size()));
}
public static void main(String[] args) throws NoSuchAlgorithmException,
NoSuchProviderException, UnsupportedEncodingException {
PasswordGenerator pg = new PasswordGenerator();
StringBuilder sb = new StringBuilder();
for (int j = 0; j < 10; j++) { // Generate 10 passwords
for (int i = 0; i < 10; i++) { // Passwords are 10 characters long
sb.append(pg.randChar());
}
System.out.println(sb.toString());
sb.setLength(0);
}
}
}
输出:
s96g9RH%BH
%Cs5DjHgRD
xGea5Kb&5b
QomXOfC98s
BU0s%gqK6J
0yOkL%SHrT
j@drmKSwhy
aKwriP#xd9
XxdjIT7jr@
Qd7OE1RYNi
在上面的示例中,我们使用默认构造函数调用SecureRandom
。 相反,我们可以使用算法和提供程序来启动SecureRandom
。 根据我们的应用程序需求,我们可能必须指定一个提供程序,但是通常最好不要提供它,并允许系统使用具有最高优先级的算法。
2.在SecureRandom上设置种子
SecureRandom
使我们能够通过.setSeed()
方法设置种子。 此方法可以接收长整数或字节数组。 不要播种SecureRandom
因为它几乎总是会损害随机生成器的安全性; 而是让它使用其内部的播种机制。 这并不意味着应该无限期地使用一粒种子。 对于运行大量随机数的应用程序,您应该定期生成新的SecureRandom
因为这将创建具有新种子的新生成器。
参考文献
翻译自: https://mkyong.com/java/java-how-to-create-strong-random-numbers/