[コマンド] ハッシュ値・強度別パスワード/パスフレーズ生成 早見メモ(Win/Mac/Linux)

Tech
[コマンド] ハッシュ値・強度別パスワード/パスフレーズ生成 早見メモ(Win/Mac/Linux)

ハッシュ値やランダムなパスワードを発行したいとき、毎回コマンドを忘れるのでまとめておきます。Windows(PowerShell)・macOS・Linux(Ubuntu)の3環境ぶん。コピペ用の自分メモです。

ℹ️ 標準搭載のコマンドを優先。追加インストールが要るものはその旨を書いています。

1. ハッシュ値を出す

文字列のハッシュ(SHA-256)

Linux (Ubuntu)

echo -n "文字列" | sha256sum
# ハッシュだけ欲しいとき
echo -n "文字列" | sha256sum | awk '{print $1}'

macOS

echo -n "文字列" | shasum -a 256
# MD5 は md5sum ではなく md5
echo -n "文字列" | md5

Windows (PowerShell)

[BitConverter]::ToString(
  [Security.Cryptography.SHA256]::Create().ComputeHash(
    [Text.Encoding]::UTF8.GetBytes("文字列"))
).Replace("-","").ToLower()

-n(改行を付けない)を忘れると末尾の改行までハッシュされ、値が変わります。ここが一番のハマりどころ。

ファイルのハッシュ

Linux

sha256sum file.zip        # md5sum / sha1sum / sha512sum も同様

macOS

shasum -a 256 file.zip    # md5 file.zip も可

Windows

Get-FileHash -Algorithm SHA256 .\file.zip
:: コマンドプロンプト(CertUtil)なら
certutil -hashfile file.zip SHA256

2. ランダムパスワードを生成する

Linux / macOS(共通・openssl)

openssl rand -base64 12    # 短め(約16文字)
openssl rand -base64 24    # 標準(約32文字)
openssl rand -hex 16       # 16進32文字

記号を除いた英数字だけにしたい / 長さをきっちり決めたいとき:

# 英数字のみ20文字(macOSでは LC_ALL=C が必須。無いと illegal byte sequence)
LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 20; echo

# 記号入り24文字
LC_ALL=C tr -dc 'A-Za-z0-9!@#$%^&*()_+=-' < /dev/urandom | head -c 24; echo

Windows (PowerShell)

暗号学的に安全な乱数(RNG)を使う方法。PowerShell 5.1 / 7 どちらでも動く書き方:

$bytes = [byte[]]::new(24)
[Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($bytes)
[Convert]::ToBase64String($bytes)

手軽な英数字版(※ Get-Random は暗号用途には非推奨。使い捨て向け):

-join ((48..57)+(65..90)+(97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_})

本番の秘密鍵・パスワードは Get-Random ではなく上の RNG 版を使うのが安全です。

3. パスフレーズ(単語をつなげる方式)

覚えやすく強い「correct-horse-battery-staple」型。おすすめは xkcdpass(要 Python)。

# インストール(pipx が手軽)
pipx install xkcdpass

xkcdpass -n 4 -d -      # 4単語をハイフン区切り(標準)
xkcdpass -n 6 -d -      # 6単語(強め)

追加インストールせずに、OS標準の単語辞書から作るなら:

# Linux (shuf は標準)
shuf -n 4 /usr/share/dict/words | paste -sd '-' -

# macOS (shuf が無いので gshuf か、下のワンライナー)
ruby -e 'puts File.readlines("/usr/share/dict/words").sample(4).map(&:strip).join("-")'

Windows は WSL か、xkcdpass(Python)を使うのが手っ取り早いです。

4. 強度の目安(エントロピー)

「どれくらいの長さ/単語数にすべきか」の目安。ビットは総当たりの強さの指標です。

種類だいたいのエントロピー
英数字(62種)12文字約 71 bit
英数字(62種)20文字約 119 bit
記号入り(94種)16文字約 105 bit
パスフレーズ4単語約 52 bit
パスフレーズ6単語約 78 bit

ざっくりの指針:

  • オンライン攻撃(試行回数が制限される)対策:50〜60 bit あれば十分
  • オフライン攻撃(ハッシュ流出後の総当たり)対策:80 bit 以上を目安に(重要アカウント・鍵は 100 bit+)

メモ

  • 文字列ハッシュは echo -n(改行なし)を忘れない
  • macOS の trLC_ALL=C を付けないとエラーになる
  • パスワード生成に Get-Random は暗号用途で使わない(RNG を使う)
  • base64 出力をさらにハッシュにかけて短くしない(文字種が減って弱くなる)

セキュリティ, コマンド, パスワード, ハッシュ