Javaのhttps://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html[SecureRandom]クラスは、暗号的に安全な疑似乱数ジェネレータを提供し、その使用目的はセキュリティに重点を置いたアプリケーションです。

この例では、意図した目的では使用せず、シンプルなパスワードジェネレータにそのメソッドを示します。

1.安全なランダムを使用したパスワードジェネレータ

従来のパスワード生成プログラムでは、大文字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`は、ランダムジェネレータの安全性をほとんど損なう可能性があるため、

SecureRandom`をシードしないようにしてください。代わりに、内部のシードメカニズムを使用させます。それは、1つの種子を無期限に使用すべきではありません。多くの乱数を実行するアプリケーションでは、新しいシードを持つ新しいジェネレータを作成するため、定期的に新しい「SecureRandom」を生成する必要があります。

参考文献

クラス]


guest post

リンク://tag/java-security/[java
セキュリティ]リンク://タグ/パスワード/[パスワード]リンク://タグ/乱数/[乱数]

security