2010-08-02 38 views
8

Cách tiếp cận tốt nhất để tạo hệ thống đăng nhập ít mật khẩu là gì?hệ thống đăng nhập ít mật khẩu

Tôi đang nghĩ để sử dụng một số loại được tạo ngẫu nhiên thẻ 16 ký tự, ví dụ:

mysite/thành viên/index.php thẻ = 2j0n1qyjgcxyu3oy

Tôi đang phát triển một hệ thống báo giá và ý tưởng là các nhà cung cấp không phải đăng ký, thay vào đó tôi tạo tài khoản của họ cho họ và tất cả những gì họ phải làm là nhấp vào liên kết trong email của họ để gửi báo giá. Điều này sẽ khuyến khích các nhà cung cấp gửi báo giá vì họ biết rằng họ không cần phải đăng ký hoặc đăng nhập.

Không có hại nhiều mà ai đó có thể làm nếu họ đoán mã thông báo, nhưng tôi ' d vẫn muốn làm cho hệ thống an toàn nhất có thể mà không yêu cầu mật khẩu.

+0

Cách duy nhất an toàn đang sử dụng một hệ thống khác nhau (đặt mật khẩu) để xác thực, như [hoạt động thư mục] (http://php.net/manual/en/book .ldap.php). Điều này sẽ làm việc cho một doanh nghiệp với tất cả các máy tính trên cùng một miền AD, nhưng rõ ràng là không áp dụng cho một trang web công cộng. –

Trả lời

5

Mã thông báo sẽ ổn, tôi sẽ sử dụng hàm băm MD5 hoặc SHA1 cho nó.

Nhưng vì vậy bạn nhận thức được, có vẻ như bạn đang có, điều này có thể bị ngửi bởi gói sniffers, đặc biệt là thông qua email, vì vậy chỉ cần biết điều đó. Nhưng nếu đó không phải là một vấn đề, tôi không thấy một vấn đề với việc sử dụng một mã thông báo cho một nhà cung cấp. Nếu nó bị đánh hơi hoặc bị lạm dụng, chỉ cần tạo lại một mã thông báo mới cho họ.

Hy vọng điều đó sẽ hữu ích.

+0

Bạn có nghĩa là mã thông báo phải là MD5 hay tôi nên so sánh mã thông báo với phiên bản MD5 của mã thông báo được lưu trữ trong cơ sở dữ liệu? – GSTAR

+0

Bản thân mã thông báo sẽ là MD5, không phải là "cần thiết", nhưng đó sẽ là sở thích của tôi. –

+0

Hãy nhớ rằng nếu cookie được đặt lại, người dùng sẽ mất tất cả thông tin tài khoản của họ mãi mãi. –

1

Cũng mã thông báo của bạn sẽ không giống mật khẩu một chút? Bạn cũng có thể chuyển hướng chúng đến một trang web đặc biệt, nơi họ phải bấm vào nút được nhấn mạnh trong thư, để xác minh danh tính của họ (hoặc để họ nhập mã pin từ thư), vì vậy bạn có thể chắc chắn không gửi tất cả dữ liệu quan trọng cho mỗi NHẬN nhưng mỗi POST (quan trọng ở nơi công cộng)

Hy vọng tôi có thể giúp

2

Đó là một cách tiếp cận khá phổ biến. Bí quyết là đảm bảo mã thông báo là duy nhất. Tôi đã sử dụng giá trị GUID trong quá khứ.

Tất cả điều này sẽ làm giảm rủi ro so với phần thưởng.

Nguy cơ ai đó có thể sử dụng mã thông báo đó để truy cập vào hệ thống của bạn. Vì nó được gửi qua email văn bản rõ ràng, rủi ro có thể là vừa phải. (Một kẻ tấn công sẽ phải lắng nghe trên mạng của họ hoặc giữa bạn và máy chủ email của họ. Vẫn không dễ dàng).

Phần thưởng là gì. Kẻ tấn công có thể gửi báo giá bằng tên của công ty. Tệ thế nào? Điều đó tùy thuộc vào bạn.

Một nguy cơ khác mà tôi có thể thấy là nếu một công ty gửi báo giá và sau đó quyết định họ không muốn tôn trọng nó. Họ chỉ có thể nói rằng họ đã không gửi nó. Người khác phải làm như vậy trong tên của họ. Một lần nữa, khả năng điều này có lẽ không phải là rất cao và có thể được xử lý theo những cách khác.

0

Nếu nhận được một số loại email hàng ngày, bạn có thể tạo ID duy nhất riêng biệt cho mỗi liên kết. Hoặc hết hạn chúng sau một khoảng thời gian cụ thể và cung cấp cho họ bản cập nhật qua email x ngày một lần.

Làm thế nào lớn một thỏa thuận là nó nếu ai đó đoán một ID hoặc nhận được một ai đó elses?

Ngoài ra, tại sao chỉ có 16 ký tự? Họ không phải gõ nó, vậy tại sao không lâu hơn?

giả

$urlToken = md5(reverse(md5($key)) . md5(right(md5(key), 16) . left(md5(key),16)); 

có tạo ra một mã thông báo 64 nhân vật.

+0

Các phương thức đảo ngược/phải/trái có được bao gồm trong PHP không? Ngoài ra, tôi đồng ý tăng số lượng ký tự, mặc dù rất khó có thể nhận được cùng một mã thông báo được tạo với 16 ký tự, có thể bạn sẽ không nhận được cùng một ký tự với 64 ký tự! – GSTAR

+0

Trong php, nó sẽ là md5 (substr (md5 ($ key), 16) substr (md5 ($ key), 0, 16)). Nếu bạn đang sử dụng MySQL là tốt, bạn cũng có thể sử dụng "chọn uuid()", mà (ở cấp độ cơ sở dữ liệu) đảm bảo bạn nhận được một id duy nhất toàn cầu. – Derrick

0

Bạn có thể thử một uuid:

<?php 

$uuid = `uuidgen`; 

echo $uuid; 

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