2009-09-08 65 views
13

Tôi hiện đang sử dụng,
base64_encode() để mã hóa mật khẩu của người dùng, điều này hoạt động tốt vì nó cho phép tôi chỉ đơn giản là sử dụng base64decode() để giải mã các mật khẩu để một từ và gửi đến đó email nếu họ mất mật khẩu.Cách tốt nhất để mã hóa mật khẩu trong PHP

Tôi đã đọc mật khẩu và rất nhiều người dường như nói rằng bạn nên sử dụng sha1() để mã hóa mật khẩu. Tôi là tất cả để cải thiện an ninh của hệ thống của tôi, nhưng nếu tôi chuyển đổi để sử dụng shal() thì tôi sẽ không thể gửi người dùng có mật khẩu bị mất.

BẠN sử dụng cái gì? Bạn có thể cho tôi một lời khuyên? Và có cách nào để giải mã một mật khẩu có thể đọc được để gửi email cho người dùng không?

Khi tôi nhập câu hỏi này, tôi chỉ nhớ rằng một số diễn đàn không gửi mật khẩu cho bạn khi được yêu cầu mà thay vào đó gửi liên kết đặc biệt để đặt lại mật khẩu của bạn, tôi đoán rằng điều này là do họ không thể giải mã được mật khẩu của bạn có lẽ?

//what I use now 
$password_encoded = base64_encode($password); 

//what I am considering using 
$password_encoded = sha1($password); 
+4

câu hỏi Thấy như thế này thực sự làm cho tôi không bao giờ muốn tạo một đăng nhập người dùng trên bất kỳ trang web nào vì sợ bảo mật khủng khiếp của họ, như lưu trữ mật khẩu có thể đảo ngược. – umassthrower

Trả lời

41

Xin vui lòng, xin vui lòng vì lợi ích của người dùng của bạn không lưu trữ mật khẩu của họ trong bất kỳ định dạng đảo ngược! Nó không quan trọng nếu nó được mã hóa Base64 hoặc triple-DES 168-bit encryption - nếu nó có thể đảo ngược, nó chính xác là an toàn như thể bạn đã không mã hóa nó ở tất cả.

Không trang web có bất kỳ lợi ích nào trong việc tự bảo vệ bản thân hoặc người dùng của trang web (hoặc có ý thức) sẽ gửi cho người dùng mật khẩu của họ qua e-mail. Điều duy nhất chúng ta có thể làm đó là ngay cả từ xa gần đến an toàn là gửi cho người dùng một email với một liên kết duy nhất sử dụng một lần cho phép họ đặt mật khẩu mới.

  • cửa hàng một hash (bcrypt hoặc PBKDF2) của mật khẩu mà đã được salted
  • vứt bỏ mật khẩu ban đầu ngay sau khi bạn đã băm nó. Excise nó từ bộ nhớ.
  • Luôn luôn yêu cầu người dùng tạo mật khẩu mới của riêng họ trên một kênh SSL

Đang cố gắng để có được bằng với bất cứ điều gì khác là một cách trung thực chỉ sơ suất. Hãy sử dụng một kịch bản rất phổ biến được sử dụng trong các cuộc thảo luận bảo mật:

Email của người dùng Frederic bị xâm phạm. Điều này có thể là do máy tính của anh ta đã mở khóa hoặc sử dụng mật khẩu yếu. Bất kể, một người không được phép có quyền truy cập vào tin nhắn của anh ấy. Lý tưởng nhất, điều này có nghĩa là không có gì hơn một số bức thư tình đáng xấu hổ được đọc bởi một người lạ. Thật không may, người trái phép phát hiện ra một diễn đàn sẽ gửi email mật khẩu của Frederic bằng văn bản thuần túy. Giống như hầu hết người dùng, Frederic sử dụng cùng một mật khẩu cho mọi thứ, kể cả ngân hàng trực tuyến của mình. Tên người dùng của anh ta được liệt kê trong một email từ ngân hàng của anh ấy. Bây giờ tình hình là rất đáng tiếc.

Người dùng đặt niềm tin vào bạn khi họ tạo mối quan hệ dựa trên thông tin xác thực với bạn. Một phần của niềm tin đó là bạn sẽ giữ những thông tin đó như một bí mật an toàn giữa bạn và họ.

liên quan

Rất nhiều vấn đề xung quanh và ý tưởng đã được trả lời rất tốt trên SO:

+0

@anonymous - Tại sao lại là DV? –

+0

Sai: "chính xác như an toàn như thể bạn đã không mã hóa tất cả" bảo mật –

+6

@ d03boy bởi tối nghĩa là giống như không có bảo mật nào cả. Trong một hệ thống khép kín như một trang web, tất cả các phần cần thiết để đảo ngược dữ liệu, bất kể làm thế nào obfuscated, nhất thiết phải có mặt. Vì vậy, nếu kẻ tấn công có quyền truy cập vào hệ thống, kẻ tấn công có quyền truy cập vào tất cả các phần. –

6

Bạn nên cho phép người dùng đặt lại mật khẩu nhưng không bao giờ RETRIEVE mật khẩu của họ. Đó là lý do tại sao bạn muốn sử dụng một băm một chiều (SHA2) thay vì một dạng mã hóa cho phép bạn giải mã nó.

Hãy tưởng tượng nếu bạn để email của mình mở. Tôi chỉ có thể yêu cầu truy xuất mật khẩu của bạn cho một số trang web, xóa email và bạn sẽ không bao giờ biết. Mặt khác, nếu bạn yêu cầu tôi đặt lại mật khẩu thay vào đó, mật khẩu tài khoản sẽ thay đổi và chủ sở hữu rõ ràng sẽ nhận ra rằng có điều gì đó sai. (Đây là một kịch bản câm nhưng khái niệm là quan trọng)

Có thể đảo ngược các dấu gạch ngang bằng cách thử tất cả các từ kết hợp (hoặc sử dụng bảng cầu vồng) cho đến khi băm phù hợp được tạo. Một cách để tránh điều này là thêm/thêm mật khẩu được cung cấp với một muối để làm cho nó trở thành một chuỗi rất dài và không thể đoán trước được. Muối phải là một chuỗi dữ liệu duy nhất duy nhất cho tài khoản của cá nhân.

Trong PHP không có hàm fAton SHA2. SHA-2 là một gia đình của các thuật toán băm, (SHA-256, SHA-384, SHA-512, vv ...)

hash('sha256', 'The quick brown fox jumped over the lazy dog.'); 
+0

Tôi đang cố gắng tìm sha2, nó dường như không có trên php của tôi – JasonDavis

+0

Cập nhật với thông tin sha-2 –

10

Là một quản trị viên, bạn không bao giờ thực sự cần phải nhớ mật khẩu của một người dùng. Bạn chỉ cần biết nếu một chuỗi họ đã từng gửi, giống với chuỗi khác.

Nếu người dùng quên mật khẩu của họ, họ không cần phải được cho biết mật khẩu cũ của họ, bạn có thể chỉ cần yêu cầu họ cung cấp mật khẩu mới.

Vì bạn không cần biết mật khẩu thực, sử dụng một số crytographic hash của các từ có vẻ như một cách an toàn để lưu trữ chúng. Tuy nhiên, các bảng lớn các chuỗi được tính toán trước đã được thực hiện để dễ dàng thực hiện tra cứu ngược lại mã băm ngược lại chuỗi gốc của nó. Chúng được gọi là rainbow tables.

Để tránh dễ tra cứu chuỗi được tính trước, bạn nên salt mật khẩu của mình trước khi băm. Muối có thể là tên người dùng của họ được thêm vào trước, hoặc ID người dùng của họ được postfixed, bất kỳ thông tin bổ sung nào bạn có trên người dùng là vĩnh viễn mà bạn có thể dễ dàng thêm vào mật khẩu trong quá trình xác thực.

+0

Tôi thấy vậy nếu tôi định sử dụng gửi mật khẩu và thêm số userid mà không bao giờ thay đổi mật khẩu, sau đó mã hóa chuỗi đó, đó sẽ là một mật khẩu muối? – JasonDavis

+3

@jasondavis băm, không mã hóa –

4

Base64Cung cấp mã hóa không bảo mật vì mọi người có thể đảo ngược dễ dàng.

Nếu bạn hoàn toàn cần đảo ngược mật khẩu, cách tốt là sử dụng câu hỏi bí mật và sử dụng câu trả lời làm khóa mã hóa. Một khi mật khẩu được mã hóa, bạn vứt câu trả lời đi (bạn không lưu trữ nó). Bạn cũng sử dụng mã hóa tiêu chuẩn sha1 cho thời gian khi bạn cần xác minh rằng mình nhập đúng mật khẩu. Nếu người dùng muốn mật khẩu của nó, anh ta nhập câu trả lời cho câu hỏi bí mật của nó, và bạn sử dụng nó để khôi phục mật khẩu và gửi lại cho anh ta.

Nó không an toàn như mã hóa dựa trên băm, nhưng nếu bạn cần gửi lại mật khẩu, đó là một sự thỏa hiệp tốt.

Bạn có thể muốn nhìn vào thư viện Mcrypt cho php http://ca3.php.net/mcrypt

1

tôi luôn luôn xóa tài khoản của tôi chỉ bất kỳ trang web rằng các email cho tôi mật khẩu của tôi. Tôi đặt quá nhiều nỗ lực và thời gian vào việc ghi nhớ mật khẩu ngẫu nhiên dài để nó được gửi cho tôi bằng văn bản thuần túy.

Sử dụng hàm băm không thể đảo ngược sha1() hoặc cao hơn để nhận dạng mật khẩu. Khi xác thực mật khẩu người dùng, hãy truy lục hàm băm và so sánh nó với hàm băm của mật khẩu được cung cấp trong quá trình xác thực. Nếu chúng khớp nhau, thì người dùng là xác thực trong các tiêu chuẩn hợp lý.

$user = "joe"; 
$password = 'password'; 

$saved_hash = DB::Query("select hash from users where username = ".quote($user)." LIMIT 1"); 

if (sha256($password) == $saved_hash) User::authenticated(); 

Không bao giờ, gửi mật khẩu qua email. Gửi một khóa duy nhất, không thể dự đoán được, chẳng hạn như trong PHP:

$key = sha256(time().rand().$secret_seed); 

Gửi khóa này cho khách hàng, để sử dụng một lần, để đặt mật khẩu mới.

+3

Đã phải DV cho người nghèo trình diễn của SQL –

+0

Whats nghèo về SQL đó? – bucabay

5

Một điều tuyệt đối phải đọc về chủ đề này là của riêng Jeff You're Probably Storing Passwords Incorrectly. Dưới đây là tóm tắt điều hành:

  1. Không phát minh ra chương trình lưu trữ mật khẩu "thông minh" của riêng bạn.
  2. Không bao giờ lưu mật khẩu dưới dạng chữ thô.
  3. Thêm một muối ngẫu nhiên dài, độc đáo vào mỗi mật khẩu bạn lưu trữ.
  4. Sử dụng băm bảo mật mã hóa.
0

Bạn sẽ muốn sử dụng một hash (tốt nhất sha1) với "muối"

+1

Tôi nghĩ rằng, thậm chí tốt hơn nữa, bạn sẽ muốn SHA2 –

+1

Mặc dù lo ngại rằng SHA1 có một lỗ hổng toán học có thể dẫn đến dễ dàng hơn để tìm va chạm, bao gồm cả muối sẽ ngăn chặn sự xuất hiện đó. Các Langauges như PHP không hỗ trợ SHA2 trong thư viện chuẩn, vì vậy SHA1 là một giải pháp thay thế rất phù hợp. –

0

Bạn có thể làm băm trên máy chủ khi chứng thực trong một truy vấn nhanh:

SELECT * FROM user WHERE password = MD5(CONCAT(?, salt)); 
+0

Đây là một chương trình băm yếu. Mật khẩu không nên được băm với MD5, bởi vì thuật toán này là cách quá nhanh và brute-buộc là quá dễ dàng. – martinstoeckli

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