Vấn đề đầu tiên tôi nghi ngờ bạn sẽ gặp phải (và đó là vấn đề lớn) là cơ sở dữ liệu của bạn không có hàm băm mật khẩu. Chắc chắn, nó có thể có MD5() và SHA1() nhưng đây là các hàm băm mật mã. Nó có bcrypt() hoặc scrypt() hoặc PBKDF2()?
Sử dụng hàm băm mật mã thay vì hàm băm mật khẩu là điều có nghĩa là mật khẩu LinkedIn có thể bị bẻ khóa quá nhanh. Nếu bạn không sử dụng một trong các chức năng trên thì bạn sẽ bị tổn thương tương tự nếu băm của bạn bị rò rỉ.
Đi trên để trả lời câu hỏi của bạn giả định rằng cơ sở dữ liệu của bạn không hỗ trợ một thuật toán mật mã băm (sử dụng bcrypt đơn giản chỉ vì tôi phải chọn một).Hai lựa chọn thay thế là:
Băm trong cơ sở dữ liệu:
$db->query("SELECT COUNT(*) FROM users WHERE username = '?' AND password = BCRYPT(?, (SELECT salt FROM user WHERE username = '?'))", $username, $password, $username);
if($row['count'] != 1)
{
// Not authenticated. Throw exception.
}
Trong trường hợp này, mật khẩu thô được gửi đến cơ sở dữ liệu và đơn giản có hoặc không có (1 hoặc 0) được trả về. Thông tin liên lạc cơ sở dữ liệu này có thể được mã hóa. Hàm băm và muối không bao giờ được giữ trong ứng dụng.
Băm trong ứng dụng:
$db->query("SELECT username, salt, password FROM users WHERE username = '?', $username);
if(bcrypt($password, $row['salt']) != $row['password'])
{
// Not authenticated. Throw exception.
}
Trong trường hợp này, băm và muối được lấy ra từ cơ sở dữ liệu vào ứng dụng và băm của mật khẩu thô và so sánh được thực hiện ở đó. Giao tiếp với cơ sở dữ liệu vẫn có thể được mã hóa. Mật khẩu thô không bao giờ được giữ trong bộ nhớ cơ sở dữ liệu.
Để có hiệu quả, chúng ta có thể giả định rằng cả hai thuật toán băm được viết bằng C (hoặc một số ngôn ngữ được biên dịch) và có thể do hệ điều hành cung cấp để cùng một lúc. Tùy chọn băm ứng dụng nhận được nhiều dữ liệu hơn dây và tùy chọn băm cơ sở dữ liệu gửi nhiều hơn và có truy vấn phức tạp hơn (về cơ bản là hai truy vấn, một truy vấn để nhận được muối và một để thực hiện so sánh). Không thể sử dụng chỉ mục theo cách tôi đã viết truy vấn đó nhưng truy vấn có thể được viết lại. Vì kích thước của dữ liệu trong cả hai trường hợp có khả năng vẫn là một gói TCP, sự khác biệt về tốc độ sẽ không đáng kể. Tôi sẽ gọi đây là chiến thắng cho tùy chọn băm ứng dụng do truy vấn phụ.
Để hiển thị. Tôi sẽ xem xét các mật khẩu thô để được nhạy cảm hơn so với băm và muối với nhau. Vì vậy, hạn chế việc tiếp xúc với mật khẩu thô có vẻ như đặt cược an toàn hơn, khiến cho ứng dụng băm là cách thực hành tốt nhất.
Tôi đoán tôi đã đơn giản hóa ví dụ nhưng bạn vẫn có thể nhúng phương thức mã hóa vào cơ sở dữ liệu, ví dụ như sử dụng các đối tượng clr trong máy chủ sql – Blootac
@Blootac Điểm tốt. Tôi đã thêm một câu trả lời cho câu hỏi thực tế với giả định rằng cơ sở dữ liệu của bạn có một thuật toán băm thích hợp. – Ladadadada
Cảm ơn bạn, mô tả tốt về ưu và nhược điểm. – Blootac