PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để băm mật khẩu trong postgresql?

Đã lâu rồi tôi chưa hỏi câu hỏi này và bây giờ tôi đã quen thuộc hơn với lý thuyết mật mã, vì vậy đây là cách tiếp cận hiện đại hơn:

Lý luận

  • Không sử dụng md5. Không sử dụng một chu kỳ băm nhanh của sha-family. Hàm băm nhanh giúp ích cho những kẻ tấn công, vì vậy bạn không muốn điều đó.
  • Thay vào đó, hãy sử dụng hàm băm sử dụng nhiều tài nguyên, như bcrypt. Bcrypt đã được kiểm tra thời gian và mở rộng quy mô để có thể chống lại trong tương lai.
  • Đừng bận tâm đến việc lăn muối của riêng bạn, bạn có thể tăng cường khả năng bảo mật hoặc tính di động của chính mình, hãy dựa vào gen_salt () để tự tạo ra các loại muối độc đáo tuyệt vời cho từng công dụng.
  • Nói chung, đừng là một tên ngốc, đừng cố viết tiền điện tử cây nhà lá vườn của riêng bạn, hãy sử dụng những gì người thông minh đã cung cấp.

Gói cài đặt 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)

Kích hoạt crypt () và bcrypt trong postgresql trong cơ sở dữ liệu của bạn

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

Sử dụng crypt () và gen_salt () trong các truy vấn

So sánh:chuyển tới hàm băm hiện có với:

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

Tạo hash of:password với một muối ngẫu nhiên tuyệt vời:

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

Hàm băm bcrypt từ trong Php hơi thích hơn một chút

password_* các hàm trong php 5.5 trở lên cho phép băm mật khẩu cực kỳ đơn giản với bcrypt (khoảng thời gian!) và có một thư viện tương thích ngược cho các phiên bản dưới đó. Nói chung rằng băm vẫn quay trở lại gói lệnh gọi hệ thống linux để sử dụng CPU thấp hơn, mặc dù bạn có thể muốn đảm bảo rằng nó được cài đặt trên máy chủ của bạn. Xem:https://github.com/ircmaxell/password_compat (yêu cầu php 5.3.7+)

Hãy cẩn thận trong việc ghi nhật ký

Lưu ý rằng với pg_crypto, tất cả các mật khẩu đều ở dạng bản rõ trong quá trình truyền từ trình duyệt, sang php, đến cơ sở dữ liệu. Điều này có nghĩa là chúng có thể được đăng nhập trong văn bản rõ ràng từ các truy vấn nếu bạn không cẩn thận với nhật ký cơ sở dữ liệu của mình. ví dụ. có nhật ký truy vấn chậm postgresql có thể bắt và ghi mật khẩu từ truy vấn đăng nhập đang diễn ra.

Tóm tắt

Sử dụng php bcrypt nếu bạn có thể, nó sẽ giảm thời gian mật khẩu vẫn chưa được băm. Cố gắng đảm bảo hệ thống linux của bạn đã cài đặt bcrypt trong crypt() vì vậy đó là hiệu suất. Bạn nên nâng cấp lên ít nhất php 5.3.7+ vì quá trình triển khai của php hơi lỗi từ php 5.3.0 đến 5.3.6.9 và do lỗi DES bị hỏng mà không có cảnh báo trong php 5.2.9 và thấp hơn.

Nếu bạn muốn / cần băm trong postgres, cài đặt bcrypt là cách tốt nhất, vì các băm được cài đặt mặc định đã cũ và bị hỏng (md5, v.v.).

Dưới đây là tài liệu tham khảo để đọc thêm về chủ đề:

  • 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. Xóa phụ huynh nếu nó không được tham chiếu bởi bất kỳ đứa trẻ nào khác

  2. Nén văn bản trong PostgreSQL

  3. Giải pháp Ruby chung cho SQLite3 LIKE hoặc PostgreSQL ILIKE?

  4. Hàm tương tự trong Postgres với pg_trgm

  5. PostgreSQL JOIN với kiểu mảng có thứ tự các phần tử mảng, cách thực hiện?