15

thể trùng lặp:
Secure hash and salt for PHP passwordsThực hành tốt nhất để lưu trữ tên người dùng và mật khẩu trong MySQL Databases

Tôi đang thực hiện một hệ thống có thông tin cửa hàng người dùng (email, tên người dùng và mật khẩu) trong một Cơ sở dữ liệu MySQL và đã thấy các khung nhìn xung đột về việc sử dụng các kiểu mã hóa, salting và encryption.

Phương pháp tốt nhất bạn nên giới thiệu là gì? Mã hóa trong MD5 hoặc SHA1? Salting hoặc không muối? Chỉ mã hóa mật khẩu hoặc cả 3 yếu tố?

Trả lời

11

Để sử dụng hàm băm mật khẩu PBKDF2NIST approved. Bạn nên sử dụng một muối không bí mật ngẫu nhiên cho mỗi mật khẩu và số lần lặp lại không cố định (trên 1000).

Đối với tên người dùng và email, có thể không đáng mã hóa.

+1

+1 cho PBKDF2 tốt hơn nhiều, mặc dù tôi thường sử dụng 10.000 lần lặp lại khi hiệu suất không phải là vấn đề;) Ví dụ: http://csharptest.net/470/another -example-of-how-to-store-a-muối-mật khẩu-băm/ –

+0

@ csharptest.net Tôi đồng ý về số lần lặp lại của bạn, ví dụ hay. – jbtule

0

Mật khẩu phải được bảo vệ bằng băm với một muối mạnh (MD5 hoặc SHA1 là tốt), để ngăn chặn tấn công bằng cách sử dụng các bảng cầu vồng.

Bạn không nên băm địa chỉ email - ngay khi bạn băm nó, bạn không thể sử dụng nó cho bất kỳ điều gì khác ngoài việc kiểm tra những gì người dùng nhập vào, vì vậy việc băm nhỏ sẽ ngăn bạn gửi email cho người đó. Tương tự như tên người dùng sẽ được lưu trữ tốt nhất trong văn bản thuần túy để cho phép bạn xác định người đó.

+1

Vui lòng không sử dụng MD5 hoặc SHA1. Cả hai đều bị phá vỡ về mặt mật mã. –

2

Nó chỉ thực sự là mật khẩu mà bạn cần mã hóa. Thực tế, bạn nên là cả hai Hashing (đó là những gì bạn có nghĩa là khi bạn nói mã hóa) trong một thuật toán tại ít nhất SHA-256 thực sự (Tôi là khá chắc chắn MD5 và SHA1 có thể crack?) Salting mật khẩu của bạn để được thêm an toàn.

Dưới đây là một câu trả lời trên phương pháp ưa thích của lưu trữ chúng: Preferred Method of Storing Passwords In Database

1

Tên người dùng và email không nên được mã hóa, bạn cần họ để được trong bản rõ, họ sẽ hữu ích hơn như vậy.

Đối với mật khẩu: họ cần TUYỆT ĐỐI được mã hóa hoặc băm, tốt nhất là với muối. Cho đến bây giờ tôi đã sử dụng một kỹ thuật khá thú vị để làm điều này: AES, chìa khóa cho đó là mật khẩu của chính nó. Vì vậy, nếu người dùng đặt mật khẩu của mình thành "blabla123", thì tôi sẽ lưu trữ mật khẩu đó trong MySQL bằng cách gọi AES_ENCRYPT('blabla123', 'blabla123'). Có 2 lợi thế cho việc này:

  • bạn không lưu trữ các khóa mã hóa bất cứ nơi nào
  • mỗi mật khẩu được mã hóa bằng một chìa khóa khác nhau. Vì vậy, ngay cả khi bạn tìm ra một chìa khóa, nó sẽ có một giới hạn về tính hữu dụng của nó.

Hiệu lực sau đó được thực hiện bằng cách mã hóa nội dung người dùng nhập và so sánh 2 giá trị.

+0

Tôi thích cái này ... –

+0

Tôi cũng thích phương pháp này! Nó có giá trị muối cũng như nếu bạn làm phương pháp này? –

+1

@PhilFaceplantYoung, tôi nghĩ bạn muốn ăn món này. Đây là mở cho các cuộc tấn công cầu vồng mà không có muối. –

6

Các thực hành tốt nhất IMO là:

  • Sử dụng một thuật toán băm như SHA256 hay SHA512. MD5 không an toàn khi bạn có thể đảo ngược băm/thực hiện một cuộc tấn công cầu vồng.

  • Sử dụng muối mạnh để đảm bảo kẻ tấn công không thể đoán mật khẩu thường được băm nếu họ đã từng truy cập vào cơ sở dữ liệu của bạn.

  • Không sử dụng mã hóa.

  • Chỉ băm mật khẩu, tên người dùng và e-mail là tốt như văn bản thuần túy.

+0

+1 Hashing email và tên người dùng sẽ khó khăn vì chúng thường không phải là trường hợp nhạy cảm. –

+1

Đây không phải là câu trả lời đúng. Bạn muốn sử dụng một hàm băm mật khẩu thích hợp như PBKDF2 hoặc bcrypt. – imichaelmiers

+0

@imichaelmiers - điều này không có nghĩa là câu trả lời của tôi không đúng. Bạn đã đề xuất hàm băm mạnh hơn, tuy nhiên SHA256 và 512 vẫn hợp lệ vì không tìm thấy va chạm băm. –

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