【気持ち悪い】 .bashrc だけでできるパスワードマネージャー

by haturatu

3 min read

こんにちは、無能です。
気持ち悪いパスワードマネージャーを紹介します。

.bashrc

私の.bashrcに以下を記載しています。
ちなみに、base91でエンコードしているのでbase91をインストール必須です。

pp2091g() {
  local dir="$HOME/.$FUNCNAME"
  if [[ -z "$1" || -z "$2" ]]; then
    echo "Usage: $FUNCNAME <string> <filename>"
    return 1
  fi

  if [[ ! -d $dir ]]; then
    mkdir -p $dir
  fi

  if [[ -f $dir/$2 ]]; then
    cat $dir/$2 | base91 | cut -c -20 | tr -d "\n" ; echo
    return 0
  fi

  echo -n "$1" | sha384sum | awk '{print $1}' | xxd -r -p > $dir/$2
  echo "Generated and saved to $dir/$2"
}

つまりはどういうことなのかというと生成部分に関しては以下を参照してください。
base91で安全なパスワードがほしい。 - SOULMINIGRIG
本当に簡易的なパスワードマネージャーです。
しかし、SSH先が多い場合このような簡易的に記号文字までいれるのは難しいため、このようにしてます。

ウェブサイト自体で使うパスワード、短い文字列なら覚えられるけど長い文字列は無理、なんてことありませんか?
なのでこれを使っていれば短い文字列で比較的強固なパスワード生成ができることと16進数から完全バイナリ化されているファイルをエンコードしているのでパスワード自体が平文で保存されることもありません。

こんな感じになる

こんな感じになります。

$ pp2091g string file
Generated and saved to /home/haturatu/.pp2091g/file
$ pp2091g string file
_+f2t2X9JyLf?S(GplK~

記号文字が対応していない場合

記号文字がbase91のエンコードで対応していない場合、長い文字列でbase64エンコードされたものを使います。
日本のサイトでは全ての記号に文字対応できていないサイトは多いため必要です。

pp6464g() {
  local dir="$HOME/.$FUNCNAME"
  if [[ -z "$1" || -z "$2" ]]; then
    echo "Usage: $FUNCNAME <string> <filename>"
    return 1
  fi

  if [[ ! -d $dir ]]; then
    mkdir -p $dir
  fi

  if [[ -f $dir/$2 ]]; then
    cat $dir/$2 | base64 | tr -d "\n" ; echo
    return 0
  fi

  echo -n "$1" | sha384sum | awk '{print $1}' | xxd -r -p > $dir/$2
  echo "Generated and saved to $dir/$2"
}

難点

一度保存されたファイルはどんなstringsでも表示ができます。

$ pp2091g string file
_+f2t2X9JyLf?S(GplK~
$ pp2091g stringa file
_+f2t2X9JyLf?S(GplK~

なぜなら

  if [[ -f $dir/$2 ]]; then
    cat $dir/$2 | base64 | tr -d "\n" ; echo
    return 0
  fi

ここでシンプルにバイナリをcatしてそのままエンコードしているだけだからです。
また、同じstringsなら同じパスワードになります。

いいところ

管理はしやすいです。ファイルベースなので必要なら別のサーバでそのまま使えます。
生成もしやすいです。ファイルを紛失してもファイル名とstringsを覚えていればそのまま復活ができます。
このパスワードマネージャーの目的は外部にできる限り依存せず、短いパスワードしか覚えられないけど比較的セキュアにしたいという気持ちだけです。
ブルートフォースには強いかもしれませんが、シェルが取られてしまったら危ういです。しかし基本メールアドレス/電話番号が分からずどこで使っているかもわからないパスワードだけ取れてもあんまり意味は無いです。
また、カスタマイズ性も簡単なシェルスクリプトなので変更もしやすいです。sha384sumではなくてsha256sumでも良いかもしれないし、文字エンコードも自分の好きなものにできるに、文字列長も自分の好きなようにはしやすいです。

それではまた。よろしくお願いします。

PGP --- Contact --- Machines --- cat -v