Java – 強力な乱数を作成する方法
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」を生成する必要があります。
参考文献
8セキュリティの強化]。
https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html
[Secure
ランダムクラス]。
https://docs.oracle.com/javase/8/docs/api/java/security/Provider.html
[Provider
クラス]
guest post
リンク://tag/java-security/[java
セキュリティ]リンク://タグ/パスワード/[パスワード]リンク://タグ/乱数/[乱数]
security