web-dev-qa-db-ja.com

postgresqlでパスワードをハッシュするにはどうすればよいですか?

Postgresqlでソルトを使用していくつかのパスワードをハッシュする必要がありますが、それを行う方法に関する関連ドキュメントを見つけることができませんでした。

それでは、postgresqlでパスワード(いくつかのソルトを含む)をハッシュするにはどうすればよいですか?

46
Kzqai

私がこの質問をしてからしばらく経ちましたが、今では暗号理論にかなり精通しているので、ここに、より現代的なアプローチを示します。

推論

  • 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-Php bcryptハッシュはやや望ましい

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をインストールする方法があります。

このトピックの詳細を参照するためのリファレンスを次に示します。

75
Kzqai

アプリケーションは、bcryptやpbkdf2などのキー派生関数を使用してパスワードをハッシュする必要があります。 安全なパスワードストレージの詳細はこちら

...しかし、データベース内の暗号機能が必要な場合があります。

pgcrypto を使用して、sha2ファミリーのメンバーであるsha256にアクセスできます。 sha0、sha1、md4、およびmd5は非常に壊れているため、パスワードハッシュにはneverを使用する必要があります。

以下は、パスワードをハッシュする適切な方法です。

digest("salt"||"password"||primary_key, "sha256")

ソルトは、ランダムに生成された大きな値である必要があります。この塩は、塩が回収されるまでハッシュを破壊できないため、保護する必要があります。データベースにソルトを保存している場合は、SQLインジェクションを使用してパスワードハッシュとともに取得できます。主キーの連結は、2人が同じパスワードを持っている場合でも同じパスワードハッシュを持つことを防ぐために使用されます。もちろん、このシステムは改善できますが、これは私が見たほとんどのシステムよりもはるかに優れています。

一般に、データベースにヒットする前にアプリケーションでハッシュを実行することをお勧めします。これは、クエリがログに表示され、データベースサーバーが所有されている場合、ログを有効にしてクリアテキストのパスワードを取得できるためです。

16
rook

例とドキュメント: 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 ... ;
8
Matej Puntar