3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TypeScriptでパスワードを自動生成

Posted at

今回はパスワード自動生成機能を作る機会があったのでついでにメモ。
標準ライブラリのみで実装しました。

サンプル

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」のβ版 (無料版)の提供開始

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?