sql >> データベース >  >> RDS >> PostgreSQL

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

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

    推論

    • 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


    1. postgres列Xは存在しません

    2. テーブル式の基礎、パート9 –ビュー、派生テーブルおよびCTEとの比較

    3. xmlノードから値をクエリする方法は?

    4. SQLiteOpenHelper onCreate()/ onUpgrade()はいつ実行されますか?