Đã 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
Có 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