🔑

JavaScriptでパスワード生成するワンライナー

2024/05/10に公開

アルファベットと数字と記号を利用して12文字で生成したい場合

((chars, len) => [...crypto.getRandomValues(new Uint32Array(len))].map(v => ((c) => crypto.getRandomValues(new Uint32Array(1)) % 2 === 0 ? c : c.toUpperCase())(chars.charAt(v % chars.length))).join(""))("abcdefghijklmnopqrstuvwxyz0123456789-_/*+.,!#$%&()~|", 12)

アルファベットと数字だけ利用して8文字で生成したい場合

((chars, len) => [...crypto.getRandomValues(new Uint32Array(len))].map(v => ((c) => crypto.getRandomValues(new Uint32Array(1)) % 2 === 0 ? c : c.toUpperCase())(chars.charAt(v % chars.length))).join(""))("abcdefghijklmnopqrstuvwxyz0123456789", 8)

読みやすいよう整形したのが下記

((chars, len) =>
  [...crypto.getRandomValues(new Uint32Array(len))]
    .map((v) =>
      ((c) =>
        crypto.getRandomValues(new Uint32Array(1)) % 2 === 0
          ? c
          : c.toUpperCase())
      (chars.charAt(v % chars.length)),
    )
    .join(""))("abcdefghijklmnopqrstuvwxyz0123456789-_/*+.,!#$%&()~|", 12)

筆者は専門家ではないためこれが暗号学的に安全な利用方法で生成されているのかを保証できない。またブラウザコンソールでの実行を想定して書いたが、そういう実行形態が本当に安全か?(プロトタイプ汚染されたページでの実行とか)というあれもある

Refs

https://developer.mozilla.org/ja/docs/Web/API/Crypto/getRandomValues
https://support.google.com/chrome/answer/7570435?hl=ja&co=GENIE.Platform%3DDesktop

Discussion