Nodeを利用したランダムパスワードの作成

私のベストプラクティス。

Base64を利用し、記号を除いた大文字小文字英数字(0~9,a~z,A~Z)の文字列を出力する。

下記は32文字文のランダムな文字列を出すサンプル。短いパスワード、長いパスワードが欲しい場合は最後の32を数を変更すればよい。

require('crypto').randomBytes(1000).toString('base64').replace(/[\/\+\=]/g,'').substring(0,32)
1

説明

require('crypto')は、Nodeの暗号化API。標準搭載されている。

require('crypto').randomBytes(1000)で、ランダムな1000Byte分のデータを出力する。

require('crypto').randomBytes(1000).toString('base64')でBase64フォーマットに変換する。文字数は1000文字以上となる。

require('crypto').randomBytes(1000).toString('base64').replace(/[\/\+\=]/g,'')で記号部分を削除する。

require('crypto').randomBytes(1000).toString('base64').replace(/[\/\+\=]/g,'').substring(0,32)で必要な文字数のみ抜き取る。

補足

randomBytes(1000)で大量のランダムデータを作成する理由としては、必要とするパスワード文字数以上を出力しておけばよいが、記号を削除するため計算が面倒なので、とりあえず1000Byteもあれば十分であろうと単純な考え。

暗号化アルゴリズムは複数あるが、ほとんどのアルゴリズムではパスワードを決まった長さ(例えば32バイト)に変換するため、後方文字(32バイト以降)が無視してしまうようなこともあるらしい

記号を取り除く理由は、プログラミングコードでコーディングを行う場合はエスケープを考慮しないといけない場合があるため。記号を含めたい場合はreplaceを削除すればよい。