• ベストアンサー

パスワード生成プログラム(JAVA)

JAVAでパスワード生成プログラムを作りたいのですが、 乱数だけだと重複などがあってちゃんとしたものが作れません。 重複がなくて、文字列の長さが同じ(長さはどのくらいでもいい)パスワードを生成できるプログラムを作る上でよいアドバイスがあったら、教えていだたきたいのですが。よろしくお願いします。 また、ソースそのものがあれば、公開して頂けないでしょうか?

  • Java
  • 回答数3
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • proust
  • ベストアンサー率57% (62/108)
回答No.3

「まったく重複がない」というものは作れませんよね。 N種類の文字をM桁つらねた文字列の種類は 最大でN^M (=NのM乗)通りしかないからです。 個人でちょっとしたページを作っている程度であれば、 参考URLをみてみてはどうでしょう。 なおAPIはこれです↓ http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/security/MessageDigest.html

参考URL:
http://www.ipa.go.jp/security/awareness/vendor/programming/b09_01_main.html

その他の回答 (2)

  • sasadora
  • ベストアンサー率68% (59/86)
回答No.2

前者なんですか、すいません。早とちりで。 でも、前にも書いたとおり私にはパスワードをユニークにする 意味が分かりません。(私が知識不足なのかもしれませんが…。) パスワードだけでユーザーを特定させるんですか? 普通はユーザーIDと、パスワードの2つで認識させるものではないでしょうか? そしてユーザーIDは重複のないユニークなものなので、 この2つのセットで認証すれば、万一同じパスワードが生成されても、 問題ないと思うのですが…。

  • sasadora
  • ベストアンサー率68% (59/86)
回答No.1

重複といっているのは、どういうことでしょう? ・同一のパスワードが生成されることがない? ・同じ文字を2回使うことがない? 別にJavaがどうこうという話ではないと思うのですが、 たぶん後者だと思うので、その前提で書きます。 (前者だとしたら、なんでパスワードがユニークになる必要があるのか 分からない…) こういったロジックはいかがでしょう? 1)パスワードで使用してよい文字列を配列に列挙する。  A,B,C,D,E,F,G,H.... 2)この配列の長さに合わせて、乱数を2つ取得する。  10個の配列なら、0~9までの乱数2つ 3)取得した乱数2つを配列の添字に使用してデータを取り替える。 4) 2),3)の処理を十分な回数繰り返す。 5)パスワードの長さ分、先頭から取り出す→パスワード。 分かりやすく言うと、トランプのように重複のないカードを 十分にシャッフルして、先頭から6枚でも8枚でもとった場合、 ランダムでも重複しませんよね?それと同じです。 パスワードにふさわしくない文字(iとjとか、gとqとか)を 含ませないようにすることも簡単です。

K-Asuka
質問者

補足

回答ありがとうございます。 前者なんですけどね(汗) パスワードを発行するするときにユーザごとに違うものを発行したいんですよ。 乱数だけでは同じパスワードができてしまいますし、 ユーザの情報(電話番号とか)からパスワードを生成する方法があればいいんですけどねぇ・・・悩んでます。

関連するQ&A

  • javaの乱数生成プログラム-バグを教えてください

    こんにちは。Web上で「重複しない乱数」を作るプログラムをいくつか見まして、どれもこれも何でこんな複雑なステップを踏むのであろう思い、どーだこんなに簡単に作れるじゃん・・・と0-9までの整数で乱数を生成するプログラムを書いてみたんです。これならAPI調べなくたって基本を身につけていれば誰でも書けると・・・けど、生成する乱数の数が100個とか200個とかなら問題ないんですが、例えば9桁の乱数を10000個作るように設定しても7500個くらいしかListに入りません。原因がどこにあるかお教えいただけますでしょうか。なにとぞよろしくお願いします。 import java.util.ArrayList; import java.util.List; public class RandomExec { static int idLength=9; //乱数の桁数を指定 static int elmSize=100; //生成する乱数の個数を指定 static List<String> list = new ArrayList<String>(); //乱数を格納するリスト public static void main(String[] args) { addList(); //生成された乱数を要素に持つリスト list を取得 //要素をひとつずつコンソール出力 for(String s : list){ System.out.println(s); } } //リストに入れるための乱数を生成するメソッド public static String addId(){ int[] id=new int[idLength]; //int配列idを宣言(要素数=乱数の桁数) String s=""; String str; //配列にMath.random()で取得した要素を入れる for(int i=0; i<idLength; i++){ int n=(int)(Math.random()*10); id[i]=n; } //指定した桁数(この場合は9個)の数字から成るString s を得るため //int型配列idの要素をStringに変換し、すべての要素を連結する for(int n : id){ str = String.valueOf(n); s+=str; } return s; //生成されたStringを返す(下のaddList()メソッドに返しています) } //addIdメソッドで作った要素候補をチェックし、重複がなければListに加えるメソッド //List list の要素数が変数elmSizeで指定した乱数の数と同じになるまで繰り返す public static void addList(){ while(list.size()<elmSize){ //addIdメソッドでlistの要素候補strを取得 String str = addId(); //listに候補と同じ文字列を持つ要素が存在しなければlistに加える if(!list.contains(str)) list.add(str); } } }

    • ベストアンサー
    • Java
  • 最長周期系列(M系列?)の生成プログラム(C言語)

    擬似乱数などに使用される最長周期系列をシフトレジスタ数nを入力として生成するプログラムを探しているのですが、どれだけ探しても乱数生成のプログラムはあっても最長周期系列のほうのプログラムが見当たらないのです。 C言語で探しています。 ソースコードも含めてどうかよろしくお願いします。

  • Classファイル → Javaソースプログラム

    どーも、こんにちは。プログラミング初心者です。 現在Javaを使ってプログラムをしています。 JavaはJavaソースをコンパイルするとClassファイルが生成されるじゃないですか? では逆に、ClassファイルからもとのJavaソースプログラムに変換する(?)、取り戻すことはできないのでしょうか??? もしかして無理なのかもしれませんが、これが出来ないとどうしていいか分かりません。 どうしても、ソースプログラムが見たいClassファイルがあるのです。 そんな状態なので困っています。 どなたか少しでもご存知の方は、ご一報ヨロシクお願いします!!

    • ベストアンサー
    • Java
  • QRコード生成プログラム

    題名の通り、QRコード生成プログラム(C言語)を探しています。 できれば、文字列を入力するとQRコードの配列(黒は1、白は0のように表現)を生成するところまでのが欲しいです。 個人で作るのはなかなか難しいのでWebで見つけようとしましたが、Windowsで動くものしか手に入れられませんでした。 linuxで動くソースを持っている方、もしくはlinuxで動くソースが掲載されているページのURLをご存知の方は、どうか教えて頂きますよう宜しくお願い致します。

  • ユニークな文字列を順次, 生成する関数

    C++において, 適当な文字列を元に, ユニークな文字列を順次, 生成する関数を作りたいと思っています. (LISPで云う, 関数gensym()と似た役割を持つ関数です.) 例えば, "hoge"というstringを元に, "hoge0", "hoge1", "hoge4", "hoge8", "hoge100", ...., といったように, stringが互いに重複しないように, 適当な数字を連結した文字列を順次生成したいのです. 以下のように, 私なりの方法を考えてみたのですが, これだと, 今まで生成したstringを保存するhoge_setが必要になります. 何かより良い(シンプル, 効率的な)方法がありましたら, 教えていただけますでしょうか? よろしくお願い致します. (乱数を用いた方法) 1. 元となるstring型の変数nameを, "hoge" で初期化. 既に作成したstring文字列を保存する, set < string > hoge_setを宣言. 2. 乱数を生成し, それをnameにappendしたものを, string型の変数name2に代入. 3. 同じ文字列が存在したら, 2. に戻る. 同じ文字列が存在しなかったら, hoge_setに追加する.

  • 乱数の生成方法

    乱数を生成するソースコードを探しています rand関数で生成される乱数はよい乱数ではないようで それ以外でいい乱数を生成する方法はどのようなものがあるのでしょうか また、実装したソースコードのサンプルがあればWEBページなどを教えていただきたいです

  • VBA-指定した範囲で重複しない乱数を生成したい

    指定した範囲(例:100~200)から10個、重複しない乱数を生成したいのですが、どのようなマクロを書けばよいでしょうか。 ループを使い、重複があれば結果を一度消して再生成、と思ったのですが、時間がかかる上Excelが落ちることがあります。 できるだけ簡単なコードでこのプログラムを書きたいのですが、知恵をお貸しください。 コード自体の投稿、または関数名での説明、どちらでもOKです。

  • 文字列生成を総当りで行う場合

    初めての質問で分かりにくいところもあるかと思いますが宜しくお願いします。 あ,い/うえ/おか,き,くけこ/さ/しす という文字列から、 あ/うえ/おか/さ/しす あ/うえ/き/さ/しす あ/うえ/くけこ/さ/しす い/うえ/おか/さ/しす い/うえ/き/さ/しす い/うえ/くけこ/さ/しす このような文章を作りたいのです。 言葉で説明しにくいのですが、"/"と"/"の間にある文字列を必ず1つ使い、","があるところを総当りで文字列を生成します。 私の作ったプログラムでは、この例のように6文で済む場合なら対応できるのですが、実際に使う文章はもっと長く、"/"の区切りも多く、更に"."が10個以上あることも多いので、文が億単位で生成されることも多々あります。intで表せない(今のプログラムでは、あらかじめ何個の文ができるか計算してから文を生成しています。)場合や、文字列を格納する場所が多くなりすぎてメモリが足りなくなり、生成できません。 この文字列生成は、上記の6個ように総当りで文字列が生成できれば、どの文が最初に生成されても構いません。できれば1文出来るごとにそれを使った違う処理に移り、返ってきたらその文を捨ててまた新たな文を生成できると嬉しいです。 どうぞ宜しくお願いします。

    • ベストアンサー
    • Java
  • Excel VBA 足し算の問題を自動生成したい

    子供のために、「1+2」のような単純な足し算の問題をひたすら大量生成したいのですが、どう組むのが一番良いでしょうか。   A  B  C  D   1 乱数 + 乱数 = 2 乱数 + 乱数 = 3 乱数 + 乱数 = 私の頭で考える限りは、こんな感じのものを何行にも渡り繰り返させれば良いのかなあとぼんやり考えているのですが、乱数を使うプログラムが私にはなかなか難しく、うまくできません。 それと・・・ ・「まったく同じ問題が二行続けて出る」事だけは避けたいのですが、 その他の重複はまったく構わないという場合はどう組めば良いでしょうか。 ・「1桁+1桁」「2桁+1桁(と、2桁+1桁)」「2桁+2桁」それぞれのシートを1枚ずつつくりたいのですが、生成される数字の桁を指定する事はできるのでしょうか。 わからない事だらけで申し訳ないのですが、教えていただけると幸いです。

  • パスワードの自動生成

    ウィンドウズ8.1を使用しています。あるサイトでパスワードの変更を求められました。パスワードの自動生成をしましたが、その際確認の為、再入力を求められます。 自動生成されたパスワードを見ることはできますが、文字数が長く組み合わせも複雑になっているのでコピーしてもなかなかうまくいきません。パスワードが2個あるとどれがどれだかわからなくなります。簡単に入力する方法がないでしょうか。 初歩的な質問ですが、困っています。 今回は別に自分で作ったもう少し簡単なパスワードを使いました。せっかく自動生成システムがあるのにもったいないです。 ※OKWAVEより補足:「富士通FMV」についての質問です。