Edited at

ソルト付きハッシュで格納するPEAR::Auth互換ライブラリを書いた

More than 5 years have passed since last update.

昨今のパスワード漏えいや不正ログインを踏まえ、パスワードの扱いに関する議論が活発です。一方で、フォーム認証ライブラリとして公開されているものは未だにMD5またはSHA1でハッシュしたものを格納してるだけだったりして、そのまま使い続けるのは心許ないので、


  • PEAR::Auth互換(というかなんというか)


  • ソルト付きハッシュを格納


  • ストレージはプリペアドステートメントを対応しているPDOのみ


というライブラリを書いてみました。

https://github.com/usopyon/mauth

サンプル(index.php)にあるようにAuth.phpの代わりにmauth.phpを呼び出し、salt用のDSN、テーブル名、カラム名を指定させるだけでPEAR::Auth用に書いたPHPがソルト付きハッシュに対応できるようになります。


index.php

require_once("mauth.php");

//require_once("Auth.php");

$param = [
"dsn" => "sqlite:users.db",
"table" => "users",
"usernamecol" => "username",
"passwordcol" => "password",
"db_fields" => "*",
"saltdsn" => "sqlite:salts.db",
"salttable" => "salts",
"saltcol" => "salt"
];


以下、箇条書きでつらつらと。


  • 本当はPHP5.5から実装されたpassword_hashを使いたかったのですが、借りてるレンタルサーバはPHP5.4なのでcryptで妥協してます。


  • 最初、pear.php.netを見て外部仕様からゴリゴリ書き始め、途中からgithubを見て他の関数を呼び出す部分を合わせます。最初からソースを参照しておけばよかったと反省。


  • PEAR::Auth互換と言いつつ、他のPEARライブラリに依存したくなかったので、ログ出力は実装してません。すみません。


  • 同様にsetAdvancedSecurityも実装していません。IPアドレスやUser-Agentが変わっていたら強制ログアウトするモードで、セッション・ハイジャックなどに有効なんですが、元のPEAR::Authの仕様だと、「誰」が怪しいか記録する前にログアウトしちゃうので本体側で実装するのがよろしいかと。


  • サンプル(index.php)はあっさり書いてますが、ライブラリ側は既存の仕様を踏襲してるので、パスワードの文字数チェックとかは本体側で実装するのがよろしいかと。


  • サンプル(setup.php)で動作確認用のSQLiteを生成できますが、そのままだとHTTP GETで簡単に引っこ抜かれちゃうので、htaccessなどで守っておくのがよろしいかと。


  • その他、色々とフィードバックをいただけると嬉しいです。