Làm cách nào tôi có thể ẩn dữ liệu bí mật trong dự án nguồn mở của mình?


13

Tôi có một dự án nguồn mở tải các tệp lên DropBox trong số một số máy chủ tệp. Ngay bây giờ tôi đang quét màn hình cho DropBox. Để sử dụng API của họ, tôi phải mã hóa khóa BÍ MẬT do họ cung cấp cho tôi để xác thực OAuth. Nhưng tôi sợ rằng chìa khóa sẽ không bí mật nếu có thể nhìn thấy rõ ràng cho bất cứ ai nhìn thấy.

Việc ai đó độc hại sử dụng khóa của tôi để tải vi-rút vào tài khoản của người dùng (có thể đã cho phép truy cập vào ứng dụng của tôi) sẽ lây lan sang máy tính của họ (nếu họ đã bật đồng bộ hóa máy tính để bàn) và cho máy tính của người khác (nếu họ đã chia sẻ các thư mục) và như vậy. : O

Tôi thấy câu hỏi chưa được trả lời này có cùng vấn đề với tôi.

Nhưng tôi muốn biết nói chung người ta sẽ giấu dữ liệu bí mật như thế nào trong một dự án nguồn mở.

Tôi có một ý tưởng.

  • Có một trình giữ chỗ trong mã nguồn như "<BÍ MẬT TẠI ĐÂY>" và chỉ điền vào khi xây dựng nhị phân để phát hành? (kinh quá!)

Bất kỳ ý tưởng phong nha?


1
Đó thực sự là cách an toàn duy nhất để làm điều đó. Bạn cũng có thể sử dụng mã hóa pgp để mã hóa khóa bí mật của mình, sau đó chỉ có bạn mới có thể giải mã nó, nhưng tại sao lại phải xuất bản nó.
Presved

Có thể muốn kiểm tra câu hỏi này: lập trình viên.stackexchange.com / questions / 180957 / Giả - không phải về các khóa API DropBox, nhưng thông báo chung là như nhau.
khoan

git-crypt đã được tạo cho bạn :) github.com/AGWA/git-crypt
nha

Câu trả lời:


14

Ý tưởng cơ bản là bạn KHÔNG đăng ký các giá trị bí mật trong mã hoặc trong tệp nhị phân được biên dịch. Đặc biệt nếu dự án là nguồn mở, bạn thực sự không nên. Có một số chiến lược cấu hình bạn có thể thực hiện để làm như vậy:

Giữ chỗ trong mã (giá trị mã hóa cứng)

Trình giữ chỗ trong mã - như đã được đề xuất - điều này lành mạnh nhất và dễ thực hiện nhất trong các ngôn ngữ lập trình động vì mã rất dễ thay đổi (không cần phải biên dịch). Tôi đã thấy rất nhiều dự án nguồn mở thực hiện điều này như MediaWiki với nó LocalSettings.php.

Các nhược điểm với chiến lược này là chìa khóa là hardcoded. Vì vậy, nếu chương trình được phân phối dưới dạng nhị phân thì việc mã hóa khóa cứng không làm cho nó đặc biệt duy trì được.

Cấu hình tập tin văn bản

Bạn cũng có thể làm điều này bằng cách thực hiện các tệp văn bản cấu hình , tức là chương trình / ứng dụng tìm kiếm tệp cấu hình và đọc các giá trị từ nó. Bạn có thể đăng ký cấu hình mẫu với trình giữ chỗ nhưng có cấu hình thực tế cục bộ trong máy của bạn.

Trong trường hợp của bạn, bạn có thể tạo một key.conf tệp văn bản bằng khóa thực tế, hãy để chương trình sử dụng tệp đó và để nó bị bỏ qua bởi kiểm soát phiên bản. Bạn có thể, vì hữu ích, hãy kiểm tra key.conf.exampletệp văn bản bằng khóa không có thật và kiểm tra xem. Đảm bảo chương trình / ứng dụng của bạn tạo thông báo lỗi hữu ích cho người dùng để thêm khóa thực tế vào đúng tệp.

Một số ngôn ngữ lập trình có API cung cấp điều này tự động cho bạn, chẳng hạn như:

Nếu ứng dụng của bạn là một ứng dụng cơ sở dữ liệu, thì hãy xem xét đưa khóa hoặc các biến cấu hình khác vào cơ sở dữ liệu. Nó giống như tệp văn bản cấu hình ở trên nhưng bạn đặt tất cả các biến cấu hình như khóa trong bảng cơ sở dữ liệu thay thế.

Thông qua chế độ xem tùy chọn hoặc ứng dụng Back Office

Nếu chương trình là một cửa sổ hoặc một ứng dụng web có chế độ xem thì bạn cũng có thể để ứng dụng tạo tệp cấu hình, thông qua chế độ xem tùy chọn sắp xếp. Bằng cách đó, bạn không cần phải kiểm tra tệp cấu hình ví dụ như được đề xuất ở trên.

MediaWiki đã giải quyết vấn đề này tương tự bằng cách tự động tạo LocalSettings.phptệp trong quy trình cài đặt ban đầu.

Phải thừa nhận rằng đây không phải là một tùy chọn cho các chương trình chỉ chạy dưới dạng tiến trình nền, dịch vụ hoặc trình nền. Tuy nhiên, đó là lý do tại sao bạn tạo các dự án GUI riêng biệt cho các dự án này để tạo điểm truy cập cho cài đặt quản trị và tùy chọn, trong các ứng dụng web thường được gọi là ứng dụng Back Office .


Một điều cần lưu ý ở đây: Việc ứng dụng tự sửa đổi cài đặt cấu hình của chính nó có nghĩa là tệp cài đặt phải được ghi bởi người dùng của ứng dụng, điều này sẽ làm tăng bề mặt tấn công, vì vậy bạn nên suy nghĩ kỹ xem bạn có thực sự cần một UI như vậy không.
tdammers

2

Cách dễ nhất là đơn giản là không công bố dữ liệu bí mật. Một số tùy chọn:

  • Sử dụng một giữ chỗ như trong câu hỏi.
  • Sử dụng tệp tiêu đề đặc biệt cho khóa, không cam kết kiểm soát nguồn và chỉ phân phối riêng cho các bên đáng tin cậy.

Tôi đã sử dụng tùy chọn thứ hai để phát triển nguồn mở bởi vì điều đó có nghĩa là bạn không phải lo lắng về việc điền chi tiết ngay trước khi xây dựng hoặc có một thay đổi để nhớ không cam kết.


2

Nếu ai đó có mã nguồn (hoặc mã byte có thể được thiết kế ngược) thì họ S get có thể lấy khóa bí mật bằng cách chạy mã trong trình gỡ lỗi và đặt điểm dừng tại điểm bạn gửi khóa.

Bạn có thể làm cho nó khó hơn một chút bằng cách cung cấp thư viện C được biên dịch sẵn để nói chuyện với hộp thả, với khóa được mã hóa trong đó, nhưng vẫn còn nhiều cách để khóa bị rò rỉ (ví dụ như tôi đang nghĩ chuỗi).

Cách an toàn duy nhất mà tôi có thể nghĩ đến khi làm điều này, là cung cấp một dịch vụ web thực hiện việc đăng bài để thả hộp. Bằng cách đó, khóa bí mật vẫn còn trên máy chủ của bạn dưới sự kiểm soát của bạn. Chi phí lưu trữ và băng thông có nghĩa là giải pháp này không lý tưởng cho một ứng dụng miễn phí, nhưng phần thưởng được thêm vào là máy chủ của bạn có thể xác thực ứng dụng khách đúng cách trước khi chuyển tiếp tệp của họ đến dropbox.

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.