2010-05-04 31 views
7

Tôi có một trang web rao vặt, nơi mọi người có thể đặt quảng cáo sản phẩm của họ.Xác minh mật khẩu; Đây có phải là cách làm cho nó an toàn không?

Đối với mỗi phân loại, người dùng phải nhập mật khẩu (để họ có thể xóa phân loại bất cứ khi nào họ muốn). Vì vậy, về cơ bản, khi ai đó muốn xóa một phân loại, họ bấm vào phân loại, bấm vào nút xóa, và nhập vào vượt qua.

Tôi sử dụng MySql làm cơ sở dữ liệu.

tôi sử dụng mã này về cơ bản:

if ($pass==$row['poster_password']) 

nơi row [poster_password] được lấy từ MySql ...

Bạn nghĩ gì? Cảm ơn

+18

tel Hãy l tôi bạn đã không lưu mật khẩu thực tế của họ trong MySQL ... – animuson

+1

vâng tôi làm, nhưng hey, trang web chưa trực tuyến, đang được phát triển ... Tôi chỉ mới bắt đầu ở mặt trận bảo mật ngay bây giờ ... Tôi lưu nó sau đó? –

+0

@animuson có quan trọng đối với trang web rao vặt không? –

Trả lời

9

Xem này: Secure hash and salt for PHP passwords

Hash mật khẩu của họ (có thể với một số muối) trên đường vào cơ sở dữ liệu. Lưu trữ mật khẩu băm của họ trong cơ sở dữ liệu (KHÔNG phải mật khẩu thực của họ). Sau đó lấy mật khẩu băm của họ từ cơ sở dữ liệu và băm mật khẩu đầu vào của họ và so sánh mật khẩu băm.

Một số mã giả què:

password_hash = hash(password_cleartext) 
# store password_hash in database 

Sau đó:

input_password_hash = hash(input_password_cleartext) 
fetched_password_hash_from_db = fetch(db, password_hash) 
if (input_password_hash == fetched_password_hash_from_db) { 
    ... authenticated ... 
} 

Đối với một sự khởi đầu với php, hãy thử: http://php.net/manual/en/function.sha1.php

+6

+1 cho lần đầu tiên đề cập đến băm. ** GIẶT KHÔNG PHẢI LÀ NGƯỜI DÂN TỆ ** - họ là những khái niệm hoàn toàn khác nhau * (nó cũng không giống như tổng kiểm tra, điều này không nhất thiết phải bảo mật về mặt mã hóa) *. Ngoài ra, ** MD5 hoàn toàn bị hỏng **, không sử dụng nó. –

+2

+1 vì đã đề cập đến MD5 bị hỏng! – dlamotte

+0

Được rồi, hàm băm là hàm php tôi đoán? Bạn có một ví dụ điển hình? –

0

Bạn nên băm mật khẩu bằng cách nào đó và lưu trữ và so sánh bằng phiên bản được băm. Xem liên kết này để biết thêm chi tiết:

http://phpsec.org/articles/2005/password-hashing.html

+0

Và vâng, đừng lưu trữ mật khẩu thực tế BẤT CỨ NƠI NÀO. – quoo

+1

Tôi nghĩ mã hóa là một từ đánh lừa ở đây. Đó là "băm mật mã", không phải mã hóa. Mã hóa âm thanh như đơn giản là mã hóa mật khẩu so với băm mà không thể "đảo ngược" được. – dlamotte

+0

Mật khẩu luôn được băm. Mã hóa không bao giờ được sử dụng cho mật khẩu. – rook

2

Không lưu trữ mật khẩu thực tế trong cơ sở dữ liệu. Thay vào đó lưu trữ một tổng kiểm tra (MD5, SHA1, vv). Khi bạn muốn so sánh, hãy thực hiện kiểm tra giá trị mà người dùng gửi và so sánh tổng kiểm tra.

Bằng cách đó bạn không bao giờ có mật khẩu thực trong bộ nhớ.

+0

... hoặc được lưu trữ ở bất kỳ đâu cho vấn đề đó. – Steven

+0

md4, md5, sha0 vàsha1 là các hàm băm bị hỏng. Bất kỳ ai nhắm đến lỗ hổng sẽ nhận được -1, xin lỗi các quy tắc của nó. sha256 nên được sử dụng. – rook

+1

Bạn phải có nó trong bộ nhớ khi bạn kiểm tra nó, trừ khi bạn băm ở phía khách hàng trong javascript. Không phải là nó quan trọng - nếu kẻ tấn công có thể truy cập vào bộ nhớ, có mật khẩu sẽ có ít lo lắng nhất của bạn. – Tgr

0

tôi sẽ mã hóa các mật khẩu trước khi lưu trữ nó, sau đó giải mã khi truy xuất nó để bạn có thể kiểm tra nó dựa vào những gì người dùng đã nhập trong văn bản thuần túy (theo mã ví dụ ở trên).

Ngoài ra, hãy tự bảo vệ mình trước bất kỳ SQL injections hoặc ai đó có thể xem tất cả mật khẩu (và dữ liệu khác) trong cơ sở dữ liệu của bạn.

+0

-1 không nên sử dụng mã hóa cho mật khẩu. Đây là một sự vi phạm rõ ràng của CWE-257 (http://cwe.mitre.org/data/definitions/257.html) Một chức năng tiêu hóa thông điệp như sha256 nên được sử dụng. Bất kỳ ai nhắm đến lỗ hổng đều nhận được -1, đó là quy tắc. – rook

+0

-1 cho The Rook cho biết mã hóa không bao giờ nên được sử dụng, sau đó trích dẫn CWE-257 mà nói "Sử dụng mã hóa mạnh, không thể đảo ngược để bảo vệ mật khẩu được lưu trữ." –

0

Điều này ngụ ý rằng mật khẩu được đặt vào mật khẩu của bạn không được mã hóa. Nếu đây là trường hợp bạn nên sử dụng một số loại mã hóa khi nhập mật khẩu. Một cách để làm điều này là chức năng MD5 có chứa mật khẩu.

Khi làm chèn bạn sẽ làm gì

Insert into table(email, password, whatever) values('$email', md5($password), whatever) 

Và khi so sánh bạn sẽ làm gì

if (md5($pass) == $row['password']) 
+0

-1 md4, md5, sha0 vàsha1 là các hàm băm bị hỏng. Bất kỳ ai nhắm đến lỗ hổng sẽ nhận được -1, xin lỗi các quy tắc của nó. sha256 nên được sử dụng – rook

+0

Đủ công bằng, bạn có thể vui lòng cung cấp nguồn không? – Gazler

+0

Xem [tại đây] (http://www.google.com/url?sa=t&source=web&ct=res&cd=1&ved=0CAYQFjAA&url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi% 3D10.1.1.60.3776% 26rep% 3Drep1% 26type% 3Dpdf & ei = 5m3gS9zCLZO8Nuigsc8J & usg = AFQjCNGSF9GeeOlCrWlb4LKSRlYlLlT2-w): * "Thuật toán được trình bày của chúng tôi [...] ** cho phép chúng tôi tìm các xung đột MD5 đầy đủ chỉ trong vài phút ** trên 3Ghz Pentium 4 ". * Wang et al. cũng cung cấp (khoảng năm năm trước đây) một phương pháp cho thấy làm thế nào để tìm thấy va chạm MD4 bằng bút chì và giấy. SHA1 đã bị phá vỡ gần đây, mặc dù không gần như là xấu (vẫn không có va chạm được biết đến). –

1

thực hành tốt nhất là để giữ một muối sha1 băm trong cơ sở dữ liệu:

if (sha1($pass.$row['poster_salt'])==$row['poster_password']) 

(poster_salt là một chuỗi ngẫu nhiên được tạo và lưu khi người dùng chọn mật khẩu.)

Bằng cách đó, nếu kẻ tấn công truy cập vào cơ sở dữ liệu của bạn, họ vẫn sẽ không nhận được mật khẩu của người dùng (có thể cũng được sử dụng ở nơi khác) - hầu hết mọi người không bận tâm chọn mật khẩu khác nhau cho các trang khác nhau.

Ngoài ra, bạn nên sử dụng kết nối an toàn (HTTPS). Và yêu cầu mật khẩu đủ mạnh.

(Ít nhất nếu bạn muốn bảo mật tốt, có thể là quá mức cần thiết trong trường hợp danh sách quảng cáo đơn giản).

+0

md4, md5, sha0 và sha1 là các hàm băm bị hỏng. Bất kỳ ai nhắm đến lỗ hổng sẽ nhận được -1, xin lỗi các quy tắc của nó. sha256 nên được sử dụng – rook

+0

+1 Câu trả lời hay nhất cho đến nay. @ The Rook: Điều đó có vẻ hơi bất công, sha1 gần như không bị hỏng như ba người kia (không có xung đột nào được tìm thấy) –

+1

@BlueRaja bạn có thể cho chúng tôi thấy điểm yếu của MD5 bằng cách sử dụng một vụ va chạm không? –

4

Mã của bạn có vẻ an toàn, nhưng thiết kế của bạn có thể cần một số công việc.

SQL Injection

Phần nguy hiểm của mã này là trong việc lưu trữ bất cứ điều gì trong cơ sở dữ liệu, hoặc hiển thị bất cứ điều gì cho người sử dụng, được thu thập từ người dùng. Vì vậy, phần bạn phải cẩn thận xảy ra trước khi ví dụ của bạn. Đảm bảo rằng bạn đang xác thực, lọc và thoát bất kỳ dữ liệu nào bạn thu thập từ người dùng, bao gồm mật khẩu và thông tin quảng cáo.

Encryption

Ưu điểm của việc lưu trữ mật khẩu trong cơ sở dữ liệu là bạn có thể cho phép người dùng lấy lại mật khẩu qua email hoặc một số phương tiện khác nếu họ đánh mất nó. Tuy nhiên, nếu bạn lưu mật khẩu, bạn nên lưu trữ chúng mã hóa, sử dụng khóa bí mật, để nếu ai đó có thể đọc trực tiếp quyền truy cập đọc vào cơ sở dữ liệu của bạn, họ không thể đọc tất cả mật khẩu ở dạng văn bản thuần túy. Tuy nhiên, bạn sẽ phải lưu trữ khóa bí mật ở đâu đó và nếu ai đó lấy khóa bí mật của bạn và có quyền truy cập vào cơ sở dữ liệu của bạn, họ sẽ có quyền truy cập vào tất cả các mật khẩu.

giá trị Hash (recommended)

Đó là thực hành tốt nhất và an toàn hơn để chỉ lưu trữ một giá trị băm chiều (SHA1 hoặc SHA256) của mật khẩu trong cơ sở dữ liệu thay cho mật khẩu thực tế. Bằng cách này, bạn không thể lấy lại mật khẩu. Giá trị băm cố ý một cách bằng cách vứt bỏ một số dữ liệu.

Thay vì truy xuất mật khẩu ban đầu, bạn băm mật khẩu mà người dùng nhập và so sánh giá trị băm với giá trị băm được lưu trữ để xem nó có khớp không. Nếu người dùng mất mật khẩu trong trường hợp này, thay vì gửi email mật khẩu cho người dùng, bạn gửi email cho người dùng mật khẩu mới, được tạo ngẫu nhiên.

Lưu trữ chỉ giá trị băm bảo vệ dữ liệu của bạn hơn nữa, vì ngay cả khi người dùng có quyền truy cập đọc vào cơ sở dữ liệu của bạn, giá trị băm không có lợi thế và không có khóa bí mật nào mở khóa tất cả giá trị băm của bạn.

Khi bạn băm mật khẩu, hãy đảm bảo sử dụng giá trị muối ngẫu nhiên và lưu trữ muối để bảo vệ danh sách băm chống lại các cuộc tấn công của cầu vồng.

Tóm tắt

Đôi khi bạn không nhận được để chọn mật khẩu. Đôi khi mật khẩu đến từ một hệ thống khác, vì vậy bạn không luôn có lựa chọn và đôi khi cấp trên của bạn (thậm chí có thể là người dùng) sẽ yêu cầu họ có thể truy xuất mật khẩu, tuy nhiên, khi có thể, bạn nên chọn tùy chọn bảo mật hơn .

Lưu ý rằng tất cả hoạt động mã hóa và giá trị băm này chỉ bảo vệ một phần máy chủ của bạn khỏi những người có thể nhận quyền truy cập chỉ đọc vào dữ liệu của bạn. Đôi khi, việc nhận dữ liệu của bạn đủ để nhận giải thưởng, vì vậy nếu người dùng có thể đọc mật khẩu băm, họ có thể đọc số thẻ tín dụng của bạn không?

Bạn cần bảo vệ cơ sở dữ liệu của mình. Bạn có mật khẩu an toàn trên hệ thống cơ sở dữ liệu của mình không? Bạn chỉ cho phép truy cập cục bộ vào dữ liệu của mình? Bạn đã tạo một người dùng cơ sở dữ liệu với ít đặc quyền để sử dụng trong ứng dụng của bạn chưa? Bạn có bảo vệ chính mình khỏi các cuộc tấn công SQL injection và scripting không?

Nếu ai đó đã đọc và ghi quyền truy cập vào dữ liệu của bạn, toàn bộ doanh nghiệp mật khẩu sẽ trở thành tranh luận.

0

gợi ý của tôi là như sau

bảng người dùng đã hai cột, một gọi là "password" và "muối" khác

$password = 'youruserpassword in plain text'; 
$salt = bin2hex(openssl_random_pseudo_bytes(32)); 
$passtostore = hash_hmac('sha384', $password, $salt); 
insert into users(password, salt) values($passtostore, $salt); 

Sau đó, để xác minh nếu người dùng đã nhập đúng mật khẩu. ..

retrive cả mật khẩu và muối từ cơ sở dữ liệu và

if(hash_hmac('sha384',$userpass, $row['salt']) === $row['password']) { 
// is valid 
} 
Các vấn đề liên quan