base91で安全なパスワードがほしい。

4 min read

こんにちは、無能です。
最近流石にChromium/Chromeのパスワード自動作成しますか?とか、すごく不安になるので、ある程度簡単である程度まで可逆的に作成することをしたい。
ちなみに、Artix Linuxの場合base91コマンドは標準で入っていなかったので、yay -S base91している前提になってます。

結論から

結局これで生成していくことにした。

echo -n "string" | sha384sum | awk '{print $1}' | xxd -r -p | base91 | tr -d "\n" && echo

※あとから思いましたが多分、awk '{printf $1}'のほうがいいです。

だらだらしたこと

正直にいってしまうと、結構sha*sumで生成した文字列を使っていたのだが文字数的には満足でハッシュ値自体が不可逆的なものなので別にそれがバレたらなんぞやっていう感じでいいんですが。
そもそものハッシュ化自体がただの16進数化した文字列というだけなので本気の総当りが来たら扱われている文字列系で言えば正規表現上だと[a-z0-9]となる。

しかも今どき大文字扱えだとか、記号を使えだとか言われているのに我ながらひどいものである。
なので今回だと、この文字列のパターン数をなんとかして増やしたい。

今回のものだとどうなるか

まず解体していくと

echo -n "string"

改行なしで文字列を標準出力へ、パイプで次へ渡す

sha384sum

受け取った文字列をSHA384でハッシュする。

awk '{print $1}'

受け取った文字列を余計なケツにある文字列 -は要らないのでawkで整形

xxd -r -p

自分も調べて初めて知ったものだけど、16進数である文字列をバイナリ形式に出力する。
なので
受け取った文字列をバイナリ形式に出力する。

base91

受け取ったバイナリをbase91でエンコードし出力する。

 tr -d "\n" && echo

そのままだとbase91で自動で改行整形される処理があるので改行コードを削除し、成功したら改行ないとコピペしづらいので、空白行を最後を出力する。
とこんな感じになる。

alleycat:[haturatu]:~/git/ckr/ckr$ echo -n "a" | sha384sum | awk '{print $1}' | xxd -r -p | base91 |tr -d "\n" && echo
"OS[fY@wwBqip+$db@5+g!yvk$jE3,M3F({qu]1(_dS2Or()Q:ZqyhOb&9Y

実際ついさっき思いついただけなので、実際にちゃんとフォームが受け付けてくれるところが多いかどうかは不明。
一応文字列数は

$ echo -n "a" | sha384sum | awk '{print $1}' | xxd -r -p | base91 |tr -d "\n" | wc -c
59

いくら短い文字列でも59文字は生成される。

いいところ

そもそもこのxxd -r -pで生成したときに一緒にバイナリデータとして保管出来る。
なので、元のstringを忘れても最悪バイナリ持っていれば復元出来る。

段階的には
sha384sum = 不可逆
xxd -r -p = 可逆
base91 = 可逆
みたいなステップになっている。
というか、元のパスフレーズより長くなっていて、元のパスフレーズを早い段階で不可逆化しとけばいいんじゃないか?ということでこうなりました。

しかも、これで生成したらsaslauthdbだとか、バイナリのデバッグで使われるstringsコマンドでバイナリの可読することも出来ない様子。
平文のテキストデータを持つよりかはマシな程度で安全。

shasumしてハッシュ化した場合の衝突可能性なんて、かなり厳しいほどだ。
それを更にバイナリデータ化したものをBase91の形式にエンコードするわけなので自分の足りない脳みそで作るパスワードよりかはマシそうだ。

.bashrcで関数を入れておく

ぶっちゃけ毎回これ入力しているのなんて地獄以外の何者でもないので

関数名() {
  echo -n "$1" | sha384sum | awk '{print $1}' | xxd -r -p | base91 |tr -d "\n" && echo
}

関数名 stringでパスワード生成出来るようにしといた。
もうコレでも突破されるんならゆらゆら帝国の人間やめときな、ならぬ暗号化やめときな、になる気がする。。。

そして、サーバー側で扱うパスワード自体の文字列長を増やしたいならばsha512使えばいいし、bash上で認識できる文字列的に減らしたいならbase64にすればいい。
お手軽に変えれてそれごとに関数を変更し.bashrcに打ち込んでしまえばいい、かな?

PGP --- Contact --- Machines