2011-01-04 34 views
7

Vì vậy, điều này về cơ bản là đảm bảo rằng tôi đang thực hiện toàn bộ quá trình đăng ký/đăng nhập ngay khi băm/băm đi.Hashing & Salting - Xác thực đăng nhập bằng cookie

Tôi có bảng người dùng với mật khẩu trường, muối, mã thông báo (rõ ràng là có những người khác nhưng điều này là quan trọng nhất). Khi đăng ký nó tạo ra một muối ngẫu nhiên, và một mã thông báo ngẫu nhiên, và nó đặt trong lĩnh vực mật khẩu này:

hash("sha256", $theirpostpassword.$randomgeneratedsalt); 

Đó muối được tạo ra ngẫu nhiên và mã thông báo được lưu trữ trong các lĩnh vực tương ứng của họ trong đó người dùng hàng trong bảng.

Vì vậy, khi đăng nhập, tôi chọn CHỈ muối từ hàng người dùng với tên người dùng mà họ chỉ định. Sau đó tôi thực hiện truy vấn đếm số lượng hàng có mật khẩu đăng của họ nối với muối cụ thể của họ và sau đó tôi đăng nhập vào. Khá chắc tôi có phần đó.

Bây giờ tôi đã suy nghĩ để xác thực đăng nhập của họ trên mỗi trang, tôi sẽ có một chức năng chạy mọi trang kiểm tra cookie của họ để xem định dạng id-username-token có khớp với hàng trong cơ sở dữ liệu hay không. Có nghĩa là mọi thông tin đăng nhập đều đặt cookie của họ bằng các thông tin đăng nhập đó.

Bây giờ điều duy nhất tôi có thể nghĩ đến để làm cho nó tốt hơn là thay đổi mã thông báo mỗi lần đăng nhập hợp lệ?

Cảm ơn những người thấu hiểu.

+1

Tôi sẽ có mã thông báo phụ thuộc vào IP của người dùng từ xa, nhưng kiểm tra cookie đó - với thông tin đó- về mọi yêu cầu có vẻ hoạt động tốt. – ncuesta

+1

Cảm ơn bạn đã phản hồi nhanh chóng, tôi đã chống lại việc kiểm tra IP hoàn toàn vì tôi biết có một số địa chỉ IP động thay đổi khá thường xuyên. –

+0

Bạn không nên tự tạo hệ thống xác thực vì có quá nhiều thứ có thể sai. Sử dụng facebook connect/twitter sign in/openid etc thay vào đó! – Alfred

Trả lời

4

Có, bạn chắc chắn phải thay đổi mã thông báo bằng mọi thông tin đăng nhập. Nếu không, một mã thông báo bị đánh cắp một lần là một tài khoản bị đánh cắp mãi mãi. Người dùng mong muốn việc đăng xuất tắt bảo mật phiên của họ khỏi bị tấn công bằng cách vô hiệu hóa cookie hoặc dữ liệu khác của họ. Thay vì mã thông báo là ngẫu nhiên, bạn có thể làm cho nó trở thành chữ ký, bằng cách tạo nó từ mã băm của id người dùng, thời gian hết hạn phiên và bất kỳ thứ gì bạn muốn trong cookie, cộng với muối (giống như hệ thống đăng nhập). Muối này không phải đến từ cơ sở dữ liệu, nhưng nó có thể. Nó có thể là một chuỗi hardcoded (đôi khi được gọi là "hạt tiêu" tôi nghĩ). Hãy nhớ coi cookie là không hợp lệ nếu quá thời gian hết hạn. Đó là lý do tại sao mã thông báo phải là chữ ký, để đảm bảo rằng chúng không giả mạo dữ liệu đó.

+1

Tôi không đồng ý với mã thông báo là chữ ký. Bạn cần mã thông báo là không thể tránh khỏi và cách duy nhất để đảm bảo đó là ngẫu nhiên. Bởi tất cả các phương tiện có chữ ký là tốt, nhưng một mã thông báo ngẫu nhiên là rất quan trọng. –

1

kiểm tra cookie của họ để xem định dạng của id-tên người dùng thẻ phù hợp với hàng trong cơ sở dữ liệu

Bạn có thể nhưng điều này là khá tốn kém và bạn không giải quyết các vấn đề quản lý phiên - việc đặt thời gian hết hạn cookie trong quá khứ không phải lúc nào cũng khiến cookie bị xóa. Bởi tất cả các phương tiện xem xét điều này cho một nhớ tôi loại chức năng (nhưng sử dụng một đường dẫn bù đắp để tránh trình bày các cookie mỗi lần).

Bạn không đạt được bất kỳ thứ gì vượt quá việc lưu trữ tên người dùng được xác thực trong phiên. Nhưng hãy thay đổi id phiên khi bạn xác thực người dùng và sử dụng SSL để chuyển mã thông báo xác thực.

2

Âm thanh khá tốt với tôi, nhưng bạn nên biết một vài điều:

Để làm cơ sở dữ liệu mật khẩu của bạn chống lại các cuộc tấn công brute-force bạn có thể lặp băm:

$hash = $password; 
for ($i = 0; $i < 1000; ++$i) { 
    $hash = hash("sha256", $hash . $salt); 
} 

Second , đảm bảo bạn sử dụng SSL mọi lúc. Nếu không có nó, nó là khá tầm thường cho một kẻ tấn công để ăn cắp cookie đăng nhập. Xem firesheep cho một ví dụ tốt về tầm thường của nó.

Chắc chắn thay đổi mã thông báo mỗi lần đăng nhập và xem xét thay đổi mã cho mọi yêu cầu để ngăn chặn các cuộc tấn công phiên và phát lại phiên.

Bạn cũng có thể chọn muối và hàm băm từ cơ sở dữ liệu và thực hiện so sánh phía máy chủ băm (thay vì trên DB) để giảm số lượng chuyến đi khứ hồi vào cơ sở dữ liệu.

Tôi muốn đề xuất mã thông báo hoàn toàn ngẫu nhiên. Bạn muốn nó là không thể tránh khỏi và cách tốt nhất để làm điều đó là ngẫu nhiên. Bạn có thể buộc mã thông báo vào một địa chỉ IP cụ thể nhưng điều này phải được thêm vào một mã thông báo ngẫu nhiên chứ không phải thay thế.

Đó là tất cả những gì bạn quan tâm. Tốt cho bạn để xin lời khuyên thay vì chỉ MD5-ing mật khẩu và gắn nó trong cơ sở dữ liệu!

Các vấn đề liên quan