Java –如何创建强随机数

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因为这将创建具有新种子的新生成器。

参考文献

  1. JDK 8安全性增强
  2. 安全随机类别
  3. 提供者类别

翻译自: https://mkyong.com/java/java-how-to-create-strong-random-numbers/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值