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