今回はパスワード自動生成機能を作る機会があったのでついでにメモ。
標準ライブラリのみで実装しました。
サンプル
const getAutoGeneratePassword = () => {
// パスワードの文字数を決定
const maxLength = 20
const minLength = 8
// パスワードに使用可能な文字を決定(今回はアルファベットの大文字と小文字 + 数字 + symbolsの記号)
const lowerCase = 'abcdefghijklmnopqrstuvwxyz'
const upperCase = lowerCase.toLocaleUpperCase()
const numbers = '0123456789'
const symbols = '%&$#()'
const chars = lowerCase + upperCase + numbers + symbols
// パスワードが持つ文字列条件を正規表現で追加(今回はアルファベット小文字1つ以上かつ数字1つ以上)
const lowerCaseRegex = new RegExp('[a-z]')
const numberRegex = new RegExp('[0-9]')
// autoGeneratedPasswordが以上の条件を満たせばvalidがtrueになる
let valid = false
let autoGeneratedPassword: string
while (!valid) {
autoGeneratedPassword = ''
// パスワードの文字数を上で決めた範囲内(今回は8文字以上20文字以下)でランダムに決定
const randomLength =
Math.floor(Math.random() * (maxLength - minLength)) + minLength
while (autoGeneratedPassword.length < randomLength) {
// 上で決定したcharsの中からランダムに1文字ずつ追加
const index = Math.floor(Math.random() * chars.length)
autoGeneratedPassword += chars[index]
}
// パスワードが上で決定した条件をすべて満たしているかチェック
// 条件を満たすまでループ
valid =
minLength <= autoGeneratedPassword.length &&
autoGeneratedPassword.length <= maxLength &&
lowerCaseRegex.test(autoGeneratedPassword) &&
numberRegex.test(autoGeneratedPassword)
}
return autoGeneratedPassword
}
ライブラリを使用したサンプル
ライブラリだとpassword-generator - npmなどがありました。
このライブラリを使うと以下のようにかけるようです。
var generatePassword = require("password-generator");
var maxLength = 18;
var minLength = 12;
var uppercaseMinCount = 3;
var lowercaseMinCount = 3;
var numberMinCount = 2;
var specialMinCount = 2;
var UPPERCASE_RE = /([A-Z])/g;
var LOWERCASE_RE = /([a-z])/g;
var NUMBER_RE = /([\d])/g;
var SPECIAL_CHAR_RE = /([\?\-])/g;
var NON_REPEATING_CHAR_RE = /([\w\d\?\-])\1{2,}/g;
function isStrongEnough(password) {
var uc = password.match(UPPERCASE_RE);
var lc = password.match(LOWERCASE_RE);
var n = password.match(NUMBER_RE);
var sc = password.match(SPECIAL_CHAR_RE);
var nr = password.match(NON_REPEATING_CHAR_RE);
return password.length >= minLength &&
!nr &&
uc && uc.length >= uppercaseMinCount &&
lc && lc.length >= lowercaseMinCount &&
n && n.length >= numberMinCount &&
sc && sc.length >= specialMinCount;
}
function customPassword() {
var password = "";
var randomLength = Math.floor(Math.random() * (maxLength - minLength)) + minLength;
while (!isStrongEnough(password)) {
password = generatePassword(randomLength, false, /[\w\d\?\-]/);
}
return password;
}
console.log(customPassword()); // => 2hP5v?1KKNx7_a-W
複雑なパスワードの自動生成などではライブラリは役に立つのかもしれませんが、今回想定したパスワードくらいであればライブラリ使用せずとも大丈夫そうでした。
個人的ニュース
半年間インターン生としてAWSとバックエンドを担当してきたのですが、先月から自分のワガママで未経験だったフロントエンド(React)を業務でやらせてもらい、知らないことだらけで楽しいインターン生活を送ってます。
そんな優しい会社で開発してきたアプリがついにリリースされたみたいです!
不動産売買事例を10秒で取得!「プロマトComps」のβ版 (無料版)の提供開始