Java - 強力な乱数を作成する方法

Java –強力な乱数を作成する方法

JavaのSecureRandomクラスは、暗号的に安全な疑似乱数ジェネレータを提供し、その使用目的はセキュリティに敏感なアプリケーションです。 この例では、意図した目的に使用するのではなく、単純なパスワードジェネレーターでメソッドを提示します。

1.Password Generator Using Secure Random

パスワードジェネレーターの慣例として、最終的なパスワードは大文字のA〜Z、小文字のa〜z、数字の0〜9、記号#、$、%、&、@で構成することができます。

PasswordGenerator.java

package com.techfou.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のシードは控えてください。代わりに、内部シードメカニズムを使用させます。 これは、1つのシードを無期限に使用する必要があるという意味ではありません。 多数の乱数を実行するアプリケーションの場合、新しいSecureRandomを定期的に生成する必要があります。これにより、新しいシードを持つ新しいジェネレーターが作成されます。