lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

C# パスワード生成機を作った

概要

乱数でパスワードを生成できるやつ作りました。
途中で飽きたのでいろいろおかしいです。(出力の部分とか、リセットボタンがなかったり、DGV使ってるけど見づらかったり)

f:id:HM_Atlas:20180422143040p:plainf:id:HM_Atlas:20180422143043p:plain

環境

ソース

github.com

文字列生成

パスワードに使用するための文字列を生成します。

/// 大文字作成
public string CreateUppercases() {
    var sr = new StringBuilder();
    for (int i = 0x41; i < 0x5B; i++) {
        sr.Append((Char)i);
    }
    return sr.ToString();
}
/// 小文字作成
public string CreateLowercases() ...省略
/// 数字作成
public string CreateNumbers() ...省略
/// 記号作成
public string CreateSymbols() ...省略

Asciiコードでforを回して文字列を生成します。
以下4つのメソッドがあります。

  • アルファベット大文字 0x41~0x5B
  • アルファベット小文字 0x61~0x7B
  • 数字 0~9 数字のみforでカウントアップ
  • 記号 0x21~0x2F

記号については記号部分の塊をそのまま使用していますが
使っても良い記号、使わないほうがいい記号が存在すると思いますので考慮する必要があると思います。

乱数の生成

パスワードを生成する際にランダムシードが必要になるので生成します。
疑似マイナンバー生成機*1*2の下りでも乱数を生成していますがアレは間違っていたので違う方法でやります。

Random r = new Random((int)DateTime.Now.Ticks);

この乱数生成部分はまた別記事で詳しくやりたいと思いますが
上記のようにDateTime.Now.Ticksをintにキャストしてシード値とするのは間違っていました。
なので下記の方法でやります。

20180423 追記
別に詳しくは書いてないですがどんな間違った方法を使っていてどう修正したかを書きました。
kitigai.hatenablog.com

public int CreateRandomSeed() {
    var bs = new byte[4];
    //Int32と同じサイズのバイト配列にランダムな値を設定する
    using (var rng = new RNGCryptoServiceProvider()) {
        rng.GetBytes(bs);
    }
    //RNGCryptoServiceProviderで得たbit列をInt32型に変換してシード値とする。
    return BitConverter.ToInt32(bs, 0);
}

ソースはコピペです。

パスワードの生成

public string CreatePasswd(int pwdLen, string pwdChar, int seed) {
    var sr = new StringBuilder(pwdLen);
    var rnd = new Random(seed);

    for (int i = 0; i < pwdLen; i++) {
        sr.Append(pwdChar[rnd.Next(pwdChar.Length)]);
    }
    return sr.ToString();
}

引数にパスワード長、パスワードに使用する文字、ランダムシードを渡します。
パスワード用の文字列の中からランダムに指定した長さ分文字列を生成します。

雑感

ブログを放置しすぎてなにか書かなくてはとなったんだけど
パット書ける内容がクソみたいなものしかなくこんな記事になってしまった

作ったと言っておいて未完成だし、解説もろくにされていないクソ記事