Cách tốt nhất để ẩn khóa API trong mã nguồn


12

Tôi cần một số ý tưởng về cách bảo vệ khóa API riêng tư trong một ứng dụng, cụ thể là trong ứng dụng ac # .NET.

Đầu tiên, tôi hiểu rằng về mặt lý thuyết là không thể che giấu bất cứ điều gì trong mã nguồn, vì vậy tôi đã nảy ra một ý tưởng khác, nhưng tôi không chắc nó hợp lý đến mức nào. Dù sao, bằng cách nào đó có thể liên lạc với một máy chủ web để xác minh khóa riêng và sau đó nói chuyện lại với ứng dụng để xác nhận rằng đó là một cái bắt tay hợp pháp?

Tôi có hai khóa để làm việc: khóa công khai (như tên cho thấy, nó không phải được đối xử với sự chăm sóc giống như khóa riêng) và khóa riêng, cần được giữ an toàn với người khác.

Bất kỳ ý tưởng về cách tôi có thể làm điều này sẽ được đánh giá rất cao.


4
Bạn đang cố gắng ngăn ai đó có quyền truy cập vào ứng dụng nhị phân được triển khai đọc khóa (như tiêu đề của bạn ngụ ý) hay bảo vệ họ khỏi sửa đổi nó (như ý tưởng của bạn về việc xác minh qua máy chủ ngụ ý)? Mục tiêu cuối cùng là gì?
gregmac

3
Có thể có ích khi phác thảo khái niệm về khóa API cho những người đọc không quen thuộc với nó. Khóa API là một bí mật được trao cho nhà phát triển một số phần mềm tương tác với một dịch vụ (thường là dịch vụ web). Nó được sử dụng để xác định nguồn lưu lượng, hạn chế nâng so với truy cập ẩn danh và lập hóa đơn cho chủ sở hữu khóa để sử dụng dịch vụ. Bạn sẽ giữ nó ở mức vừa phải và tốt nhất là thu hồi nó nếu nó bị xâm phạm. Vì nó cần được truyền đạt đầy đủ đến dịch vụ, bạn luôn thua cuộc.
Lars Viklund

@gregmac Có, tôi đang cố gắng ngăn người dùng bên thứ ba của ứng dụng đọc khóa.
Spencer

Đừng để nó ở đó
CodeART 5/214

Câu trả lời:


12

Để tóm tắt:

  • Bạn có một khóa API do nhà cung cấp cấp cho bạn để bạn có thể sử dụng API của họ và bạn có nghĩa vụ ngăn không cho người khác biết khóa này
  • Bạn đang thực hiện cuộc gọi đến API của nhà cung cấp đó (yêu cầu khóa API) trong mã ứng dụng của bạn
  • Bạn đang triển khai ứng dụng tới các hệ thống mà khách hàng có quyền truy cập vào các tệp nhị phân và do đó có khả năng dịch ngược / khử mã hóa hoặc chặn lưu lượng

Cách tốt nhất để ngăn chặn sự thỏa hiệp của khóa này là giữ quyền kiểm soát nó. Điều này có nghĩa là nó sẽ không bao giờ được triển khai trên máy chủ nơi bất kỳ ai ngoài bạn có thể đọc tệp nhị phân và không bao giờ truy cập liên kết liên lạc mà bạn không kiểm soát.

Cuối cùng, nếu các nhị phân nằm ngoài tầm kiểm soát của bạn, mọi thứ trong đó nằm ngoài tầm kiểm soát của bạn. Tương tự, nếu ai đó có thể chặn lưu lượng, họ có thể nắm bắt khóa API ( có khả năng ngay cả khi bạn đang sử dụng SSL ).

Tôi có thể thấy hai cách chính để thực hiện việc này, cả hai cách này đều không bao gồm khóa API riêng trong ứng dụng đã triển khai của bạn:

Nhận khóa API duy nhất cho mỗi lần triển khai

Điều này sẽ yêu cầu một số mối quan hệ bổ sung với nhà cung cấp, nơi bạn có thể lấy khóa hoặc để khách hàng của bạn có được khóa.

Điều này thực sự khá phổ biến với, ví dụ, các sản phẩm sử dụng Google Maps API. Người tạo phần mềm có khóa riêng họ sử dụng khi phát triển / chạy bản sao của họ, nhưng họ không đưa nó vào phần mềm, và thay vào đó, yêu cầu bạn, như người dùng cài đặt phần mềm nói, phải truy cập Google và lấy API của riêng bạn Chìa khóa. Phần mềm chỉ có một tùy chọn cấu hình để đặt khóa API Google Maps để sử dụng.

Trên thực tế, nhiều nhà cung cấp phát hành khóa API theo hợp đồng yêu cầu bạn thực hiện theo cách này, do đó bạn thậm chí có thể đi sai đường và đây có thể là giải pháp duy nhất bạn được phép sử dụng theo Điều khoản dịch vụ của nhà cung cấp và / hoặc bất kỳ hợp đồng pháp lý nào bạn có thể có với họ.

Sử dụng Proxy

Thiết lập API proxy, nơi ứng dụng của bạn gọi API của bạn (trên máy chủ của bạn) và đến lượt mình, API của bạn gọi API của nhà cung cấp bằng cách sử dụng khóa.

Bạn có thể cần bảo vệ bổ sung trên API của mình, ví dụ: một cái gì đó để đảm bảo chỉ ứng dụng của bạn đang sử dụng nó. Điều này có thể được thực hiện bởi:

  • làm cho chức năng trở nên cụ thể không có gì ngoài ứng dụng của bạn có thể sử dụng nó
  • Danh sách trắng IP
  • Một số cơ chế cấp phép / ủy quyền hiện có mà bạn đã có cho máy chủ của mình
  • Hệ thống khóa API của riêng bạn nơi bạn có thể cấp khóa cho khách hàng của mình

Điều cần lưu ý ở đây là bạn có thể không được phép làm điều này. Nhà cung cấp của bạn có thể có Điều khoản dịch vụ hoặc hợp đồng pháp lý ngăn bạn xây dựng "dịch vụ tổng hợp" hoặc proxy, vì vậy bạn cần kiểm tra điều đó.


Xử lý hành vi sai trái

Ngay cả khi khóa của bạn không bị xâm phạm, nếu một trong những khách hàng của bạn đang làm điều gì đó khiến nhà cung cấp chặn khóa của bạn, đột nhiên TẤT CẢ khách hàng của bạn bị vô hiệu hóa và cách khắc phục duy nhất của bạn là cập nhật cho mọi người khác.

Tương tự, nếu bạn muốn chặn một trong những khách hàng của mình (ví dụ: họ đã ngừng thanh toán, vi phạm bản quyền phần mềm, v.v.) thì bạn không thể làm điều đó mà không phát hành bản cập nhật cho mọi người khác, sau đó vô hiệu hóa khóa.

Các hậu cần của điều này cho bất cứ điều gì ngoài một số ít khách hàng sẽ nhanh chóng trở thành không thể bảo vệ.

Cho dù bạn hoạt động như một proxy hoặc có một khóa duy nhất cho mỗi cài đặt, bạn có thể xử lý bất kỳ tình huống nào trong số này một cách tương đối dễ dàng (và ít ảnh hưởng đến bất kỳ ai khác).


Cố gắng bảo vệ khóa trong khi nó được nhúng trong phần mềm của bạn cuối cùng là một nỗ lực vô ích. Bất kể bạn làm gì, bất kỳ kẻ tấn công nào có quyền truy cập vào các tệp nhị phân, nguồn và / hoặc kênh liên lạc và được xác định đủ để có được chìa khóa của chúng sẽ có thể làm như vậy.

Vì vậy, đừng nhúng nó. "Động thái chiến thắng duy nhất là không chơi."


2
+1 cho "Nhận khóa API duy nhất cho mỗi lần triển khai." Thậm chí có thể được sử dụng cùng với proxy, cung cấp cho bạn khả năng [giới hạn] để vô hiệu hóa các khóa / máy khách nghịch ngợm.
Svidgen

@svidgen Điểm rất tốt, tôi đã thêm một phần thảo luận về điều đó. Cảm ơn.
gregmac

+1, một chìa khóa vạn năng sẽ gần như luôn cắn bạn trong ***
Wyatt Barnett

Phản ứng rất sâu sắc. Thật không may, tôi chỉ được gán một khóa API riêng vì vậy yêu cầu người dùng tìm nạp khóa là không thể, vì tôi thuộc NDA với các giao thức mạng, do đó là lý do cho khóa riêng. Các proxy có lẽ cũng ra câu hỏi. Tôi có thể phải dùng đến một cách nào đó để biến nó thành một định dạng không thể đọc được và đặt nó ở đâu đó trong nguồn - không phải là một lựa chọn tuyệt vời, nhưng không còn nhiều lựa chọn.
Spencer

4

Nếu bạn có một khóa trong mã đối tượng, nó được công khai theo định nghĩa. Có những hack xung quanh obfuscators nhanh chóng dịch ngược mã đối tượng. Khóa riêng sẽ nằm ngoài mã đối tượng và trong tệp khác. Phần khó là cung cấp khóa riêng này cho người dùng. Khi được cung cấp, bạn có thể sử dụng chữ ký của khóa riêng, được xử lý ở phần cuối của tệp và khóa chung trong ứng dụng để xác minh tính toàn vẹn của khóa riêng. Một máy chủ web cũng có thể thực hiện xác minh này, nếu bạn có một kênh liên lạc an toàn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.