PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana saya bisa hash kata sandi di postgresql?

Sudah lama sejak saya mengajukan pertanyaan ini, dan sekarang saya jauh lebih akrab dengan teori kriptografi, jadi inilah pendekatan yang lebih modern:

Penalaran

  • Jangan gunakan md5. Jangan gunakan satu siklus hash cepat sha-family. Hash cepat membantu penyerang, jadi Anda tidak menginginkannya.
  • Gunakan hash intensif sumber daya, seperti bcrypt. Bcrypt telah teruji oleh waktu dan ditingkatkan untuk menjadi bukti masa depan.
  • Jangan repot-repot menggulirkan garam Anda sendiri, Anda mungkin mengacaukan keamanan atau portabilitas Anda sendiri, andalkan gen_salt() untuk menghasilkan garam unik yang luar biasa untuk digunakan sendiri.
  • Secara umum, jangan bodoh, jangan coba-coba menulis crypto buatan sendiri, gunakan saja apa yang telah disediakan oleh orang-orang pintar.

Paket pemasangan 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)

Aktifkan crypt() dan bcrypt di postgresql di database Anda

// 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

Gunakan crypt() dan gen_salt() dalam kueri

Bandingkan :pass ke hash yang ada dengan:

select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)

Buat hash dari :password dengan garam acak yang bagus:

insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)

Hashing bcrypt dari-dalam-Php sedikit lebih disukai

Ada password_* fungsi di php 5.5 dan di atasnya yang memungkinkan hashing kata sandi sederhana dengan bcrypt (tentang waktu!), Dan ada pustaka kompatibilitas mundur untuk versi di bawahnya. Umumnya hashing itu kembali ke membungkus panggilan sistem linux untuk penggunaan CPU yang lebih rendah, meskipun Anda mungkin ingin memastikan itu diinstal di server Anda. Lihat:https://github.com/ircmaxell/password_compat (memerlukan php 5.3.7+)

Hati-hati saat masuk

Perhatikan bahwa dengan pg_crypto, kata sandi ada dalam teks biasa selama transmisi dari browser, ke php, ke database. Ini berarti mereka dapat dicatat dalam plaintext dari kueri jika Anda tidak berhati-hati dengan log basis data Anda. misalnya memiliki log kueri lambat postgresql dapat menangkap dan mencatat sandi dari kueri masuk yang sedang berlangsung.

Ringkasan

Gunakan php bcrypt jika Anda bisa, itu akan mengurangi waktu kata sandi tetap tidak di-hash. Coba pastikan sistem linux Anda telah menginstal bcrypt di crypt() jadi itu berprestasi. Upgrade ke setidaknya php 5.3.7+ sangat disarankan karena implementasi php sedikit bermasalah dari php 5.3.0 ke 5.3.6.9, dan secara tidak tepat kembali ke DES yang rusak tanpa peringatan di php 5.2.9 dan yang lebih rendah.

Jika Anda ingin/membutuhkan hashing dalam-postgres, menginstal bcrypt adalah cara yang harus dilakukan, karena hash default yang diinstal sudah tua dan rusak (md5, dll).

Berikut adalah referensi untuk bacaan lebih lanjut tentang topik ini:

  • 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. LOWER() – Konversikan ke Huruf Kecil di PostgreSQL

  2. Pencadangan Inkremental PostgreSQL dan Pemulihan Point-In-Time

  3. Bagaimana Random() Bekerja di PostgreSQL

  4. Argumen Baris Perintah PSQL dalam skrip DO

  5. Cara terbaik untuk menghitung catatan dengan interval waktu sewenang-wenang di Rails+Postgres