オープンソースプロジェクトで機密データを非表示にするにはどうすればよいですか?


13

複数のファイルホスト間でDropBoxにファイルをアップロードするオープンソースプロジェクトがあります。現在、DropBoxの画面スクレイピングをしています。APIを使用するには、OAuth認証用に提供された秘密キーをハードコードする必要があります。しかし、だれでも見ることができるように見えれば、鍵は秘密ではないのではないかと思います。

悪意のある誰かが私のキーを使用してウイルスをユーザーのアカウント(すでに私のアプリへのアクセスを許可している)にアップロードし、PC(デスクトップ同期が有効になっている場合)および他のPC(彼らは共有フォルダを持っていた)など。:O

私と同じ問題を抱えているこの未回答の質問を見つけました。

しかし、私は一般に、オープンソースプロジェクトで機密データを隠す方法を知りたいと思います。

アイデアが一つあります。

  • ソースコードに「<SECRET KEY HERE>」などのプレースホルダーを用意し、リリース用のバイナリをビルドするときにのみ埋めます。(うん!)

適切なアイデアはありますか?


1
それが本当に唯一の安全な方法です。あなたも秘密鍵を暗号化するためにpgp暗号化を使用することができます、そしてあなただけがそれを復号化できますが、なぜそれを全くわざわざ公開します。
プレスコット

この質問を確認したい場合があります:Programmers.stackexchange.com/questions/180957/…-DropBox APIキーに関するものではありませんが、一般的なメッセージは同じです。
tdammers

git-cryptが作成されました:) github.com/AGWA/git-crypt
nha

回答:


14

基本的な考え方は、コードまたはコンパイル済みバイナリに機密値をチェックインしないということです。特に、プロジェクトがオープンソースの場合、実際にはそうすべきではありません。そのためには、いくつかの構成戦略を使用できます。

コード内のプレースホルダー(ハードコードされた値)

コード内のプレースホルダー -提案されたように-これは、コードを変更するのが簡単であるため(コンパイルする必要なしに)動的プログラミング言語で最も健全で最も簡単です。MediaWikiのようにこれを行う多くのオープンソースプロジェクトを見てきましたLocalSettings.php

この戦略欠点は、キーがハードコーディングされていることです。そのため、プログラムがバイナリとして配布されている場合、キーがハードコーディングされていても、特にメンテナンスが容易になりません。

構成テキストファイル

また、設定テキストファイルを実装することでこれを実行できます。つまり、プログラム/アプリケーションは設定ファイルを検索し、そこから値を読み取ります。プレースホルダーを使用してサンプル構成をチェックインできますが、実際の構成はマシンのローカルにあります。

あなたの場合key.conf、実際のキーでテキストファイルを作成し、プログラムにそのファイルを使用させ、バージョン管理に無視させることができます。役に立つためにkey.conf.example、偽のキーでテキストファイルをチェックインし、チェックインすることができます。プログラム/アプリケーションがユーザーに正しいエラーメッセージを作成して、正しいファイルに実際のキーを追加するようにしてください。

次のような一部のプログラミング言語には、これを自動的に提供するAPIがあります。

アプリケーションがデータベースアプリの場合は、データベースにキーまたは他の構成変数を配置することを検討してください。上記の構成テキストファイルと同じですが、代わりにキーなどのすべての構成変数をデータベーステーブルに入れます。

設定ビューまたはBack Officeアプリから

プログラムがウィンドウまたはビューを備えたWebアプリケーションである場合、並べ替えの設定ビューを使用して、アプリケーションに構成ファイルを作成させることもできます。そうすれば、上記のようにサンプルの設定ファイルをチェックインする必要はありません。

MediaWiki LocalSettings.phpは、初期インストールプロセスでファイルを自動生成することで同様にこれを解決しました。

確かに、これはバックグラウンドプロセス、サービス、またはデーモンとしてのみ実行されるプログラムのオプションではありません。ただし、これらの個別のGUIプロジェクトを作成して、通常Back Officeアプリケーションと呼ばれるWebアプリで、管理および設定のエントリポイントを作成する理由です。


ここで注意すべき点が1つあります。アプリケーション自体が独自の構成設定を変更するということは、設定ファイルがアプリケーションのユーザーによって書き込み可能である必要があることを意味します。
tdammers

2

最も簡単な方法は、単に機密データを公開しないことです。いくつかのオプション:

  • 質問のようにプレースホルダーを使用します。
  • 特にキーにヘッダーファイルを使用し、ソース管理にコミットせず、信頼できる当事者にのみプライベートに配布します。

ビルドの直前に詳細を入力したり、コミットしないように変更する必要があることを心配する必要がないため、オープンソース開発では2番目のオプションを使用しました。


2

誰かがソースコード(またはリバースエンジニアリングが可能なバイトコード)を持っている場合、デバッガーでコードを実行し、キーを送信するポイントにブレークポイントを置くことで、秘密キーを取得できます。

ドロップボックスと通信するプリコンパイル済みCライブラリをキーでエンコードして提供することで、少し難しくすることができますが、キーが漏れる方法はまだたくさんあります(たとえば、文字列を考えています)。

私がこれを行うことを考えることができる唯一の安全な方法は、ドロップボックスへの投稿を行うWebサービスを提供することです。これにより、秘密鍵は管理下のサーバーに残ります。ホスティングと帯域幅のコストにより、このソリューションは無料のアプリケーションには理想的ではありませんが、追加のボーナスは、Dropboxに送信されるファイルを中継する前にサーバーがクライアントを適切に認証できることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.