Việc phân phối phần mềm của bạn thực sự là mấu chốt của vấn đề.Việc băm tên người dùng và mật khẩu và lưu trữ chúng trong phần mềm không hữu ích hơn việc lưu trữ các giá trị chưa băm, vì một trong hai sẽ hoạt động để truy cập vào máy chủ API. Nếu bạn định triển khai tên người dùng và mật khẩu cho người dùng của mình, tôi nghĩ bạn có thể sử dụng tên đó như một điều khiển trước con trỏ tới API mà không lưu trữ các giá trị trong chính phần mềm đó. Hãy để tôi mô tả điều này trong hai phần.
Yêu cầu Chữ ký
Phương pháp phổ biến nhất được sử dụng để xác minh yêu cầu API là yêu cầu chữ ký. Về cơ bản, trước khi yêu cầu được gửi đến máy chủ API, các tham số trong yêu cầu được sắp xếp và một khóa duy nhất được thêm vào danh sách kết hợp. Toàn bộ lô sau đó được sử dụng để tạo ra một băm, được thêm vào yêu cầu. Ví dụ:
public static function generateRequestString(array $params, $secretKey)
{
$params['signature'] = self::generateSignature($params, $secretKey);
return http_build_query($params,'','&');
}
public static function generateSignature($secretKey, array $params)
{
$reqString = $secretKey;
ksort($params);
foreach($params as $k => $v)
{
$reqString .= $k . $v;
}
return md5($reqString);
}
Bạn có thể tạo một chuỗi truy vấn yêu cầu API sử dụng mã ở trên chỉ đơn giản bằng cách gọi phương thức generateRequestString()
với một mảng của tất cả các thông số bạn muốn gửi. Khóa bí mật là khóa được cung cấp duy nhất cho từng người dùng API. Nói chung, bạn chuyển id người dùng của mình tới máy chủ API cùng với chữ ký và máy chủ API sử dụng id của bạn để tìm khóa bí mật của bạn từ cơ sở dữ liệu cục bộ và xác minh yêu cầu theo cùng cách bạn đã tạo. Giả sử rằng khóa và id người dùng là chính xác, người dùng đó phải là người duy nhất có thể tạo chữ ký chính xác. Lưu ý rằng khóa không bao giờ được chuyển trong yêu cầu API.
Thật không may, điều này yêu cầu mọi người dùng phải có một khóa duy nhất, đây là vấn đề đối với ứng dụng dành cho máy tính để bàn của bạn. Dẫn tôi đến bước thứ hai.
Temporal Phím
Vì vậy, bạn không thể phân phối phím với các ứng dụng vì nó có thể được dịch ngược, và các phím sẽ thoát ra. Để phản tác dụng, bạn có thể tạo ra các khóa rất ngắn.
Giả sử bạn đã triển khai một phần của ứng dụng dành cho máy tính để bàn hỏi người dùng về tên người dùng và mật khẩu của họ, bạn có thể yêu cầu ứng dụng thực hiện yêu cầu xác thực cho máy chủ của bạn. Khi xác thực thành công, bạn có thể trả về khóa thời gian với phản hồi, ứng dụng dành cho máy tính để bàn sau đó có thể lưu trữ trong suốt thời gian của phiên được ủy quyền và sử dụng cho các yêu cầu API. Vì bạn đã đề cập rằng bạn không thể sử dụng SSL, xác thực ban đầu này là phần dễ bị tổn thương nhất và bạn phải sống với một số hạn chế.
Bài viết mà Andy E đề xuất là một cách tiếp cận tốt (tôi đã bình chọn nó). Về cơ bản nó là một cái bắt tay để thiết lập một khóa ngắn ngủi có thể được sử dụng để xác thực. Có thể sử dụng cùng một khóa cho băm chữ ký. Bạn cũng có thể mất cơ hội của bạn và chỉ cần gửi tên người dùng/mật khẩu không được mã hóa và nhận được một chìa khóa thời gian (nó sẽ chỉ xảy ra một lần), nhưng bạn phải biết rằng nó có thể được đánh hơi.
Tóm tắt
Nếu bạn có thể thiết lập một khóa phiên theo thời gian, bạn sẽ không cần phải lưu trữ bất cứ điều gì trong chương trình khách hàng có thể được dịch ngược. Một tên người dùng/mật khẩu được gửi một lần đến máy chủ của bạn là đủ để thiết lập điều đó. Khi bạn có khóa đó, bạn có thể sử dụng khóa đó để tạo yêu cầu trong ứng dụng dành cho máy tính để bàn và xác minh yêu cầu trên máy chủ API.
Điều này giống như chính xác những gì tôi đang tìm kiếm. Cảm ơn! –