2013-05-01 22 views
5

Tôi có một kịch bản PHP đăng nhập với muối trên cơ sở dữ liệu, nhưng trong kịch bản đăng ký của tôi, tôi thấy:Làm cách nào để cập nhật bảo mật trong tập lệnh đăng nhập của tôi từ MD5 lên một cái gì đó an toàn hơn?

$qry = "INSERT INTO accounts(username, firstname, lastname, password) " . 
VALUES('$username','$fname','$lname','" . md5($_POST['password']) . "')"; 

và cho đăng nhập:

$qry="SELECT * FROM accounts WHERE username='$username' AND password='" . 
md5($_POST['password']) . "'"; 

Có một số mã có thể thay thế các MD5 ? Cái gì đó an toàn hơn?

Tôi đã nghe nói về SHA1 hoặc một cái gì đó.

+1

1. Sử dụng thư viện auth exiting 2. Sử dụng auth hiện có .. có nhiều vấn đề được đánh bại đến chết trên SO - search cho ["php hash password"] (http://stackoverflow.com/search? q = php + hash + password) và đọc tốt: SQL injection; lựa chọn băm không phù hợp (SHA-1 cũng không phù hợp); không có muối (mặc dù những gì được yêu cầu); các vấn đề khác ở nơi khác ..? – user2246674

+0

ive đọc md5 là khủng khiếp nữa, sha256 và muối đã được giới thiệu, nhưng im sẽ xem xét những gì bạn đã đăng và thực hiện một số nghiên cứu. cảm ơn bạn vì đã đi đúng hướng. –

+1

MD5 không nên được sử dụng để băm mật khẩu; nhưng chính xác lý do tại sao không áp dụng cho SHA-1. [MD5 băm vẫn * không thể * là khả thi "chưa được" "(http://stackoverflow.com/a/13446272/2246674) - tuy nhiên, * cả MD5 và SHA-1 đều dễ bị tấn công bởi vì chúng đều rất nhanh và có thể song song *. Sử dụng muối có thể ngăn chặn các cuộc tấn công của bảng cầu vồng (và không sử dụng muối là một mật khẩu băm vô giá vì các cuộc tấn công bảng cầu vồng), nhưng nó không thể ngăn chặn các cuộc tấn công brute force, đó là lý do tại sao SHA-1 không * phù hợp hơn MD5 cho nhiệm vụ cụ thể này. – user2246674

Trả lời

3

Câu trả lời ngắn

Sử dụng bcrypt không md5 hoặc sha1

Còn câu trả lời

Sử dụng crypt() khó. Có một API mật khẩu PHP băm mới sắp tới trong PHP phiên bản 5.5, bạn có thể đọc về nó ở đây:

https://gist.github.com/nikic/3707231

Nó sử dụng bcrypt và làm cho toàn bộ quá trình rất dễ dàng. Tất nhiên php 5,5 là chưa sẵn sàng, vì vậy trong khi chờ đợi có một thư viện để cung cấp API mới này ngay bây giờ:

https://github.com/ircmaxell/password_compat

Edit: Xem chủ đề này cho một câu trả lời nhiều kỹ lưỡng hơn về chủ đề:

How do you use bcrypt for hashing passwords in PHP?

+0

vì vậy tôi chỉ có thể trao đổi md5 với bcrypt và nó nên thích ứng với chính nó? –

+0

@DxVermakaXeno Không, bạn không thể trao đổi nó. Đọc các tài liệu PHP trên crypt() mà tôi đã liên kết ở trên. Và đọc chuỗi SO mà tôi vừa thêm một liên kết vào, nó có rất nhiều mã ví dụ. – jszobody

+0

Thích đọc [RFC] (https://wiki.php.net/rfc/password_hash) cho API băm mật khẩu mới. –

1

xét bài @jszbody, bạn cũng nên cập nhật trường mật khẩu của bạn để cho bạn muốn chương trình bạn đang sử dụng.

Bây giờ bạn có băm MD5, bạn có thể chỉ có "BAC232BC1334DE" hoặc một cái gì đó.

Khi bạn truy cập SHA hoặc bất cứ điều gì, bạn nên thay đổi thành: "SHA: YOURSHAHASHHERE".

Vì bạn không thể thay đổi bất kỳ mật khẩu hiện có nào của mình ngay bây giờ. Điều này sẽ làm cho nó tương thích ngược hơn, vì bây giờ bạn có thể hỗ trợ cả hai lược đồ.

Vì bạn nhận được mật khẩu ban đầu trong khi đăng nhập, bạn có thể tự động nâng cấp mật khẩu của mình tại chỗ khi mọi người đăng nhập.

Bạn nhận được hồ sơ người dùng của mình, kiểm tra mật khẩu. Nếu không có sơ đồ, hãy sử dụng MD5 và so sánh mật khẩu. Nếu đúng (nghĩa là họ có thể đăng nhập), bạn có thể cập nhật mật khẩu MD5 cũ của họ thành mật khẩu SHA mới.

Ngoài ra, có vẻ như bạn không đang sử dụng mật khẩu của mình. Bạn phải muối mật khẩu của bạn để khi Mary Sue sử dụng "ilovekittens" cho mật khẩu của mình, và Big Jake Mahoney sử dụng "ilovekittens" làm mật khẩu của mình, bạn không nhận được cùng một mật khẩu giống hệt nhau.

Bạn cũng có thể lưu trữ muối trong mật khẩu: "SHA: RANDOMSALTCHARACTERS: YOURSALTEDHASHHERE".

Việc đánh giá cao được khuyến khích. Unsalted, nó khá nhiều không quan trọng toàn bộ rất nhiều những gì chương trình bạn sử dụng.

+0

*** Có rất ít hoặc không có lợi ích khi sử dụng SHA-1 trên MD5 cho băm mật khẩu ***. Một giá trị muối tốt (hoặc tương đương) nên được sử dụng trong mọi trường hợp hoặc băm là * vô ích * do các bảng cầu vồng và sự cân bằng thời gian/không gian - do đó tôi sẽ nói "Yêu cầu phải trả tiền". – user2246674

0

Hãy thử sử dụng các lớp sau đây:

<?php 
    class PassHash { 

     // blowfish 
     private static $algo = '$2a'; 

     // cost parameter 
     private static $cost = '$31'; 

     // mainly for internal use 
     public static function unique_salt() { 
      return substr(sha1(mt_rand()),0,22); 
     } 

     // this will be used to generate a hash 
     public static function hash($password) { 

      return crypt($password, 
         self::$algo . 
         self::$cost . 
         '$' . self::unique_salt()); 

     } 
     // this will be used to compare a password against a hash 
     public static function check_password($hash, $password) { 

      $full_salt = substr($hash, 0, 29); 

      $new_hash = crypt($password, $full_salt); 

      return ($hash == $new_hash); 

     } 

    } 

?> 

bao gồm nó trong trang của bạn như sau:

include_once('passhash.class.php'); 

Hash mật khẩu bằng cách:

PassHash::hash("test"); 

Và kiểm tra xem nó với:

if (PassHash::check_password($databasepassword, $formpassword)){ 
    // do stuff 
} 

Chức năng này sử dụng mã hóa Blowfish. Để biết thêm thông tin về Blowfish goto PHP.net/crypt

Blowfish được coi là cách hiệu quả nhất nhưng mạnh nhất để mã hóa mật khẩu. Không sử dụng MD5 hoặc SHA1 mà không sử dụng muối!

+0

Không sử dụng MD5 hoặc SHA1 (cho điều này) ở tất cả! – user2246674

+0

tôi đồng ý, tuy nhiên. Đối với các hệ thống tìm kiếm bảo mật nhỏ, bạn có thể sử dụng md5 với muối. Miễn là bạn giữ muối ra khỏi thư mục httpd của bạn. Nếu không tôi vẫn không thấy lý do tại sao bạn không nên sử dụng md5. Vì nó không thể đảo ngược được mặc dù ... –

+0

* Không * MD5 và SHA1 là phù hợp (có hoặc không có muối) vì chúng * có thể được brute-buộc *. Xem nhận xét của tôi về bài đăng chính. Tôi đồng ý hoàn toàn với việc sử dụng bcrypt (như được hiển thị) vì nó có khả năng chống lại các cuộc tấn công bạo lực. (Câu trả lời này cũng cho thấy chức năng tạo muối * tốt *.) – user2246674

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