#要旨
CGIの全盛時代に培ったPerlの技術を、安全かつモダンに使える方法を私なりの方法で提供したいので、自作のモジュールの紹介とその作成方法について共有します。
##こんなモジュールを作りました
Text::Password::AutoMigration - generate and verify Password with any contexts
##日本語で要約すると
Text::Password::AutoMigrationは怠惰な管理者のためのモジュールです。
パスワードのハッシュを新規作成する分にはSHA-5121を用いる一方、
認証においてはCORE::crypt
,MD5
,SHA-1 by hex
,SHA-256
及び SHA-512
を自動的に識別します。
したがって、
- このモジュールを使い
- DBに保存している認証用ハッシュを定期的に置き換えるだけ
で、暗号化強度の低いハッシュから強固なハッシュへの移行が可能になる2というものです。
#作り方ダイジェスト
核となるモジュールは低級です。いやむしろ低級であるべき3です。
以前、こちらで記事にした際にも全く誰にも見向きもされなかった4モジュールが原本です。(正確には、CORE::crypt
からMD5
への、今思えば執筆時点でさえほぼ無意味の駄作でした。)
これをあえてCORE::crypt用とMD5用に分離し、Mooseによる継承をして差分を書くということを徹底します。
そして、それらを継承する形で、本来目指すSHA内での移行を行うモジュールを書きます。
最後に、全てを包括し、自動的に認証を行うモジュールに仕上げます。
#メリットの話
-
まず何より継承とその管理が楽チン
対@ISA
で考えてみよう。Perl5の暗黒面に再び触れる度胸があるのかい? -
機能別に
package
を切り分けた方が保守が楽
テクニカルな話になりますけど、どこかを直そうと思った時に、ファイル名で検索できるのすごい大事。 -
テストを書く時に機能別に分割されてた方が楽
これ実際にやってみると全然違います。 -
上記の前提だとエンバグしにくい(バグの発見が容易い)
機能とテストが正しく分別されていれば、当然そうなりますね。 -
coercionが強力
ま、今回これには使ってないけどな -
強制的にオブジェクト指向化
もともとこのモジュールは
継続してblessすべき適当なデータが見つからない
という理由でコンストラクタを持っていませんでした。でもパッケージ変数とかに変に値持たせる(エンバグ要因)より、初めから継承される前提でhas
しちゃった方が健全だという結論にたどり着きました。
#デメリットの話とか
-
遅いとか言われてるけど、それ本番に関係あるの?
PSGIなりMojoなり使う時ってplackup
やmorbo
でコンパイルしますよね? -
ちょうど良いドキュメントがない
Mooseやって見ました程度の記事は見つかるけど、なんかこうそのちょっと先の記事はないかもわかんないです、ってかそれがこの記事書いた動機です。