2015-03-01 15 views
7

Tôi có một trang web rất nhỏ và gần đây tôi đã cố gắng để làm cho nó an toàn hơn, tôi sử dụng để lưu trữ mật khẩu của tôi trong văn bản thuần túy.Làm cho trang web của tôi an toàn hơn, Tôi có sử dụng password_hash đúng không?

Tôi nghĩ Im làm điều đó đúng, nhưng như là một "sở thích" lập trình Tôi muốn chắc chắn vì vậy tôi hỏi bạn, các chuyên gia

Khi người dùng đăng ký tôi làm: password_hash($their_password, PASSWORD_DEFAULT) và lưu trữ trong cột 'mật khẩu' trong bảng người dùng. Tôi sử dụng PASSWORD_DEFAULT vì điều đó có vẻ tốt nhất theo php.net. .

Lưu ý rằng hằng số này được thiết kế để thay đổi theo thời gian khi các thuật toán mới và mạnh mẽ hơn được thêm vào PHP"

Âm thanh tốt

Và phần Login (rất đơn giản):

if (count($_POST) > 0) { 

$username = trim($_POST['username']); 
$password = trim($_POST['password']); 

$query = $db->prepare("SELECT password FROM users WHERE username = ?"); 
$query->execute(array($username)); 
$row = $query->fetch(); 

if (password_verify($password, $row['password'])) { 
    echo "Correct password"; 
    // create session... 
} else { 
    // wrong password 
} 

Có lẽ tôi nên kiểm tra xem tên người dùng có tồn tại trước hay không nhưng bạn nghĩ gì?

+1

Có vẻ ổn. Đó là cách sử dụng password_hash \ verify. Quan trọng cần biết rằng thuật toán bạn đang sử dụng được gọi là bcrypt được khuyến nghị. Tôi khuyên bạn nên sử dụng cột mysql là BINARY (60) để tiết kiệm bộ nhớ, –

+1

Có vẻ tốt với tôi. Tôi cá nhân đặt phần truy vấn trong một phần khác nhau của mã của bạn mặc dù (bọc nó trong một lớp có lẽ). – Bono

+0

Tôi đang bỏ phiếu để đóng câu hỏi này thành chủ đề vì nó phù hợp cho http://codereview.stackexchange.com, không quá nhiều SO. – deceze

Trả lời

2

Dường như bạn đã hiểu rõ tài liệu và cách xây dựng mã bạn cần. Xấu hổ về bạn đã sử dụng mật khẩu chữ thô thậm chí tạm thời, nhưng quyết định của bạn để sửa chữa bằng phương pháp đúng (ví dụ. Không md5 như tôi một người ngớ ngẩn (Tôi thực sự cần phải cập nhật hệ thống tiết kiệm mật khẩu của tôi ...)) thật tuyệt vời.

Vấn đề duy nhất tôi có thể thấy là một số người có thể có mật khẩu của họ bắt đầu hoặc kết thúc bằng một khoảng trắng. Mật khẩu như vậy sẽ mất không gian hàng đầu/cuối của họ và thực sự người dùng có thể bị báo động rằng họ có thể đăng nhập bằng hai dấu cách hoặc không có gì! Vì vậy, có lẽ tốt nhất để xóa những cuộc gọi trim;)

+0

cảm ơn bạn. có xấu hổ về tôi tôi có nghĩa là damn 2015 của nó và bạn đang phải về trim, bạn nên cho phép người dùng của bạn để nhập bất cứ điều gì họ muốn làm mật khẩu của họ. tôi sẽ loại bỏ những trims đó ngay bây giờ – Smugglaren

-3

Xin chào :) Tôi cũng là một người có sở thích, và tôi nghĩ tôi có thể chỉ cho bạn đúng hướng, mặc dù không biết nhiều về cách phép thuật xảy ra. 1) người dùng nhập mật khẩu của mình, mã hóa chương trình bằng cách sử dụng một phương pháp nhất định và mật khẩu được mã hóa sẽ được lưu. 2) bam. NOBODY có thể xem bản gốc là gì - ngay cả người dùng đã nhập nó. Khi đăng nhập, thao tác đó được lặp lại và mật khẩu "bất cứ điều gì người dùng nhập để đăng nhập" được mã hóa bởi cùng một quy trình và sau đó nó được so sánh với mật khẩu đã được mã hóa cũng được lưu. Chúng phải khớp nếu chúng là cùng một bản gốc không được mã hóa.

Vâng

Để bảo mật thêm, một cái gì đó gọi là "muối" thỉnh thoảng "bổ sung" để quá trình mã hóa, để làm cho nó khó khăn hơn nhưng để crack mật khẩu. Nói bằng cách nào đó ai đó đã giữ mã hóa của bạn VÀ danh sách mật khẩu được mã hóa và cố gắng hoàn nguyên quy trình bằng cách đảo ngược kỹ thuật mã của bạn? Vâng, bây giờ người đó có thêm công việc tìm thấy "muối" của bạn là gì ... (nó có thể là một chuỗi được lưu trong máy chủ của bạn, một mẹo "chơi với ngày tháng", vv ... nhiều tùy chọn) . Đây là những gì tôi nhớ từ những gì tôi đọc. Rất nhiều gợi ý để giúp bạn bắt đầu. Và hơn thế nữa:

tôi sử dụng này: mà tôi nhận được từ đâu đó trong những năm trước internet

function encryptTheString($password, $salt, $iter_count=4096, $keylen=64,   $hash_alg= 'sha256') 
{ 
    // Compute the length of hash alg output. 
    // Some folks use a static variable and save the value of the hash len. 
    // Considering we are doing 1000s hmacs, doing one more won't hurt. 
    $hashlen = strlen(hash($hash_alg, null, true)); 

    // compute number of blocks need to make $keylen number of bytes 
    $numblocks = ceil($keylen/$hashlen); 

    // blocks are appended to this 
    $output = ''; 
    for ($i = 1; $i <= $numblocks; ++$i) { 
     $block = hash_hmac($hash_alg, $salt . pack('N', $i), $password, true); 
     $ib = $block; 
     for ($j = 1; $j < $iter_count; ++$j) { 
      $block = hash_hmac($hash_alg, $block, $password, true); 
      $ib ^= $block; 
     } 
     $output .= $ib; 
    } 

    // extract the right number of output bytes 
    return substr($output, 0, $keylen); 
} 

và một cuộc gọi như

$ePassword=ANDYETpbkdf2($password,"111111111122222222223333333333444444444455555555566666666661234"); 

Sẽ là hoàn toàn ok :) cho sha256 đọc cho bắt đầu giác ngộ thêm.

+2

Việc bán tự động được thực hiện bởi 'password_hash'. Không cần nó ở đây. –

+0

cũng cảm ơn bạn nhưng tôi không nghĩ rằng muối là cần thiết sau khi đọc php.net như password_hash tạo ra một muối cho mỗi mật khẩu băm, do đó bạn không phải lo lắng về điều đó. "Chúng tôi khuyên bạn không nên tự tạo muối cho chức năng này. Nó sẽ tự động tạo ra một muối an toàn cho bạn nếu bạn không chỉ định một." – Smugglaren

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