Postgresqlでソルトを使用していくつかのパスワードをハッシュする必要がありますが、それを行う方法に関する関連ドキュメントを見つけることができませんでした。
それでは、postgresqlでパスワード(いくつかのソルトを含む)をハッシュするにはどうすればよいですか?
私がこの質問をしてからしばらく経ちましたが、今では暗号理論にかなり精通しているので、ここに、より現代的なアプローチを示します。
_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)
_
_// 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
_
: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)
_
PHP 5.5以降には_password_*
_関数があり、bcryptを使用した簡単なパスワードハッシュ(ほぼ時間!)が可能です。また、それより下のバージョンには下位互換性ライブラリがあります。 Generally CPU使用率を下げるためにLinuxシステムコールをラップするためにハッシュがフォールバックしますが、サーバーにインストールされていることを確認することもできます。参照: https://github.com/ircmaxell/password_compat (php 5.3.7+が必要)
Pg_cryptoでは、ブラウザからphp、データベースへの送信中、パスワードはすべてプレーンテキストであることに注意してください。これは、データベースログに注意を払っていない場合、クエリからin plaintextを記録できることを意味します。例えばpostgresqlのスロークエリログがあると、進行中のログインクエリからパスワードをキャッチしてログに記録できます。
可能であればphp bcryptを使用すると、パスワードがハッシュ化されないままでいる時間が短縮されます。 Linuxシステムのcrypt()
にbcryptがインストールされていることを確認して、パフォーマンスが向上するようにしてください。 phpの実装はphp 5.3.0から5.3.6.9にわずかにバグがあり、php 5.2.9以前では警告なしに壊れたDES
に不適切にフォールバックするため、少なくともphp 5.3.7+へのアップグレードを強くお勧めします。 。
Postgres内でのハッシュが必要な場合は、デフォルトでインストールされているハッシュが古くて壊れている(md5など)ため、bcryptをインストールする方法があります。
このトピックの詳細を参照するためのリファレンスを次に示します。
アプリケーションは、bcryptやpbkdf2などのキー派生関数を使用してパスワードをハッシュする必要があります。 安全なパスワードストレージの詳細はこちら 。
...しかし、データベース内の暗号機能が必要な場合があります。
pgcrypto を使用して、sha2ファミリーのメンバーであるsha256にアクセスできます。 sha0、sha1、md4、およびmd5は非常に壊れているため、パスワードハッシュにはneverを使用する必要があります。
以下は、パスワードをハッシュする適切な方法です。
digest("salt"||"password"||primary_key, "sha256")
ソルトは、ランダムに生成された大きな値である必要があります。この塩は、塩が回収されるまでハッシュを破壊できないため、保護する必要があります。データベースにソルトを保存している場合は、SQLインジェクションを使用してパスワードハッシュとともに取得できます。主キーの連結は、2人が同じパスワードを持っている場合でも同じパスワードハッシュを持つことを防ぐために使用されます。もちろん、このシステムは改善できますが、これは私が見たほとんどのシステムよりもはるかに優れています。
一般に、データベースにヒットする前にアプリケーションでハッシュを実行することをお勧めします。これは、クエリがログに表示され、データベースサーバーが所有されている場合、ログを有効にしてクリアテキストのパスワードを取得できるためです。
例とドキュメント: http://www.postgresql.org/docs/8.3/static/pgcrypto.html
UPDATE ... SET pswhash = crypt('new password', gen_salt('md5'));
SELECT pswhash = crypt('entered password', pswhash) FROM ... ;