Category tech.

考えてみるとほとんどパスワードを保存するコードを書いたことがない。現状のベストプラクティスを知らなかったのでメモ書き。

現状では bcrypt 使うのがいいみたい。b は Blowfish の b。

Modular Crypt Format というフォーマットとコンパチの出力をする。crypt (3) はもともと DES の短いフォーマットだが、弱すぎたため md5 拡張なりSHA512 拡張などが存在している。(htpasswd でも使われているので見たことある人は多いだろう)

これの Blowflish を使ったものが bcrypt で、prefix に $2$, $2a$, $2x$, $2y$ $2b$ がついている。prefix の違いはバージョンの違いであり、現在は 2b を使うのが良い。ストレッチング回数も出力に含まれるので、あるとき急にストレッチング回数を増やしても特に問題はない。

このフォーマットは出力に salt も含むので、生成された MCF はそのまま保存すれば良い。

Blowfish ってなんだ

Blowfish 自体は一方向ハッシュ化アルゴリズムではなく共通鍵暗号化アルゴリズム。処理速度が早く鍵長がある程度可変でライセンスフリーというのが特徴。

共通鍵暗号なのになんでハッシュとして使えるの?

bcrypt は "OrpheanBeholderScryDoubt" という決まった文字列を 64回 Blowfish で暗号化する。 このとき暗号に使う状態 (暗号化の鍵) を password や salt から初期化する。この初期化にも Blowfish の暗号化が使われる。

暗号化済みテキストに鍵の情報が入ることはない (もしあったとしたら暗号化アルゴリズムではない) ので一方向になる。

また "OrpheanBeholderScryDoubt" に復号化できるキーを探す (クリブ / plain text attack) も Blowfish では難しいため、実質的にブルートフォースアタックしかできない。

備考: salt を別途保存する必要がないのは bcrypt に限らない

そもそも Modular Crypt Format のものは des crypt ですら salt も出力に含んでいる。ググると「bcrypt なら salt は別に保存する必要がない」と書いてる人がいたりする。間違いではないが正しくはない。

Modular Crypt Format のいくつかのパターンを引用する

des_crypt    : {salt}{checksum}
md5_crypt    : $1${salt}${checksum}
bcrypt       : $2a${rounds}${salt}{checksum}
sha256_crypt : $5$rounds={rounds}${salt}${checksum}

( https://passlib.readthedocs.io/en/stable/modular_crypt_format.html から一部をコピペ)

備考: パスワード保存は必要か?

そもそも現代ではプラットフォーマーでなければパスワードを保存しなければならないケースがかなり少ない。OAuth などで外部サービスに認証を委託したほうがはるかに楽だからだ。パスワードを保存するということはそれ自体が難しいうえに、パスワードリセットや2段階認証なども含めてトータルで抜け道がないか考える必要がある。

ref.

  1. トップ
  2. tech
  3. パスワード保存のベストプラクティスと bcrypt のメモ書き

なかなか見た目も可愛いのでエンクロージャーから作りなおすというほどでもない。吸音材(ホワイトキューオン)をいれるのと、回路定数だけ見なおすことにした。

アンプICは 8002A CK2T24 1N と刻印されている。http://www.shenzhensum.com/products/datasheet/8002%282.0W%29.pdf これとかかな

基板上の入力カップリングコンデンサは LCR メータで測ると 0.1μF。入力抵抗は 682 =6.8kΩ。 fc = 1/(2πRi*Ci) で、そんなわけで、入力は234Hzのハイパスフィルタを構成してしまっている。

フィードバック抵抗は 223 = 22kΩ。Av =2*(Rf/Ri) で、約6.5倍の電圧ゲイン。

入力定数のおかげで低音がかなりカットされている。これはこれで別に悪くはないけど、試しにもうちょっと低音まで出せるようにしてみた。やったことは 4.7μF を並列に繋げるだけ。チップコンなら単に積層してあげるだけなので難しくはない。そもそもこういうカップリングにセラミックコンデンサを使うのはよくない (DCバイアスでかなり容量が変化する) みたいだけど、あんまこだわらない。

  1. トップ
  2. tech
  3. ダイソー300円スピーカーのちょい改造

sdkmanager をダウンロードする

Android Studio のダウンロードページから「コマンドラインツールのみ」を選んでダウンロードしてくる。Android Studio が必要なら別に全部入りでもいい。

このコマンドラインツールには共通で使う最低限のものしか入ってない。

プラットフォームごとにツールをダウンロードする

REPO_OS_OVERRIDE を指定しつつダウンロードすると、動かしているプラットフォーム以外のバイナリも取得することができる。例えば Mac OS で Linux のバイナリが欲しいときなどに使える。

REPO_OS_OVERRIDE=linux ./sdkmanager --sdk_root=/tmp/linux --verbose  "build-tools;28.0.3"
  1. トップ
  2. tech
  3. Android SDK の各プラットフォームのビルドツールの一部を使いたいとき