この質問をしてからしばらく経ちましたが、今では暗号理論に精通しているので、より現代的なアプローチを次に示します。
推論
- md5は使用しないでください。 sha-familyクイックハッシュの単一サイクルを使用しないでください。クイックハッシュは攻撃者を助けるので、それは望ましくありません。
- 代わりに、bcryptなどのリソースを大量に消費するハッシュを使用してください。 Bcryptは時間テストされており、将来にわたって利用できるようにスケールアップされています。
- わざわざ独自のソルトをロールバックしないでください。独自のセキュリティや移植性を台無しにする可能性があります。gen_salt()を使用して、独自に使用できる素晴らしいソルトを生成してください。
- 一般的に、馬鹿にならないでください。独自の暗号を作成しようとせず、賢い人々が提供したものを使用してください。
Debian/Ubuntuインストールパッケージ
sudo apt-get install postgresql // (of course)
sudo apt-get install postgresql-contrib libpq-dev // (gets bcrypt, crypt() and gen_salt())
sudo apt-get install php5-pgsql // (optional if you're using postgresql with php)
データベースのpostgresqlでcrypt()とbcryptをアクティブにします
// Create your database first, then:
cd `pg_config --sharedir` // Move to the postgres directory that holds these scripts.
echo "create extension pgcrypto" | psql -d yOuRdATaBaSeNaMe // enable the pgcrypo extension
クエリでcrypt()とgen_salt()を使用する
:passを既存のハッシュと比較します:
select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)
ランダムソルトを使用して:passwordのハッシュを作成します:
insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)
From-in-Phpbcryptハッシュが少し好ましい
password_*
があります php 5.5以降の関数は、bcryptを使用した簡単なパスワードハッシュを可能にし(約時間!)、それより下のバージョンには下位互換性ライブラリがあります。 一般的に そのハッシュは、とにかくCPU使用率を下げるために、Linuxシステムコールをラップすることにフォールバックしますが、サーバーにインストールされていることを確認することもできます。参照:https://github.com/ircmaxell/password_compat(php 5.3.7+が必要)
ロギングに注意してください
pg_cryptoでは、ブラウザからphp、データベースへの送信中、パスワードはすべてプレーンテキストであることに注意してください。これは、プレーンテキストでログに記録できることを意味します データベースログに注意しない場合は、クエリから。例えばpostgresqlの遅いクエリログがあると、進行中のログインクエリからパスワードをキャッチしてログに記録する可能性があります。
まとめ
可能であればphpbcryptを使用すると、パスワードがハッシュされないままになる時間が短縮されます。 Linuxシステムのcrypt()
にbcryptがインストールされていることを確認してください パフォーマンスが良いです。 phpの実装はphp5.3.0から5.3.6.9に少しバグがあり、壊れたDES
に不適切にフォールバックするため、少なくともphp5.3.7+にアップグレードすることを強くお勧めします。 php5.2.9以下では警告なし。
postgres内のハッシュが必要な場合は、デフォルトでインストールされているハッシュが古くて壊れているため、bcryptをインストールするのが最善の方法です(md5など)。
このトピックに関する詳細情報は次のとおりです。
- http://codahale.com/how-to-safely-store-a-password/
- http://www.postgresql.org/docs/9.2/static/pgcrypto.html
- https://github.com/ircmaxell/password_compat