ユーザーがOAuth Twitter、Googleなどの認証情報を使用してログインできるようにするWebサイトに取り組んでいます。これを行うには、これらのさまざまなプロバイダーに登録して取得する必要があります。さまざまな体の部分に対する誓約で保護しなければならない超秘密のAPIキーです。私のキーが壊れている場合、その部分はヤンクされます。
APIキーは、認証リクエストを実行するために実行時に使用されるため、私のソースと一緒に移動する必要があります。私の場合、キーはアプリケーション内の構成ファイル内またはコード自体内に存在する必要があります。 1台のマシンで構築して公開する場合は、問題ありません。ただし、ソースコントロールを混在させると、状況はさらに複雑になります。
私は安価なろくでなしなので、クラウドやGitHubでTFSなどの無料のソース管理サービスを使用したいと思います。これは私に少し難問を残します:
APIキーがコード内にあり、コードがパブリックリポジトリで利用できる場合、どうすれば体をそのまま保つことができますか?
これを処理する方法はいくつも考えられますが、どれも満足できるものはありません。
私は、開発、デバッグ、展開を通じてスムーズに機能し、誰にでもできるように、プライベートを世界(スナップチャットを除く)と共有しないことを保証する保証された方法を本当に探しています。これは完全に非現実的です。 それで、現実的に私は何ができますか?
技術詳細:VS2012、C#4.5、ソース管理はTFサービスまたはGitHubのいずれかになります。現在、部分クラスを使用して、機密性の高いキーを、ソース管理に追加されない別の.csファイルに分割しています。 .gitignoreを使用して部分クラスファイルがチェックインされないようにすることができるので、GitHubには利点があると思いますが、以前にそれを台無しにしました。 「ああ、よくある問題、これはあなたがそれを行う方法です」を望んでいますが、私は「それができるだけ多くを吸わない」ために解決しなければならないかもしれません:/
コードに秘密情報を入れないでください。起動時にコードによって読み取られる構成ファイルに入れます。構成ファイルは、「工場出荷時のデフォルト」でない限り、バージョン管理の対象にしないでください。また、個人情報を含めないでください。
これをうまく行う方法については、質問 バージョン管理と個人設定ファイル も参照してください。
すべての秘密キー/保護キーをシステム環境変数として設定できます。構成ファイルは次のようになります。
private.key=#{systemEnvironment['PRIVATE_KEY']}
これがこれらのケースを処理する方法であり、コードには何も入りません。さまざまなプロパティファイルやプロファイルと組み合わせると、非常にうまく機能します。環境ごとに異なるプロパティファイルを使用します。ローカル開発環境では、ローカルセットアップを簡略化するために、プロパティファイルに開発キーを配置します。
private.key=A_DEVELOPMENT_LONG_KEY
.gitignore
プライベートデータを含むファイルTEMPLATE
をDATA
に置き換えるローカルブランチを使用するTEMPLATE
<-> DATA
TEMPLATE
をDATA
に置き換えるダミーコードの上にあるMQパッチ(変更セットはパブリック、パッチはプライベート)暗号化されたファイルにシークレットを入れ、それをコミットします。パスフレーズは、システムの起動時に提供されるか、私がコミットしない小さなファイルに保存されます。 Emacsがこれらの暗号化されたファイルを陽気に管理するのは素晴らしいことです。たとえば、emacs initファイルには次のものが含まれます:(load "secrets.el.gpg")、これは機能します-エディターを起動すると、これらのまれな作業でパスワードの入力を求められます。誰かが暗号を破る心配はありません。
これはAndroid/Gradle固有ですが、gradle.properties
にあるグローバルuser home/.gradle/
ファイルでキーを定義できます。これは、buildTypeまたはフレーバーに応じて異なるプロパティを使用できるため、つまり、開発用のAPIとリリース用の異なるAPIを使用できるので便利です。
gradle.properties
MY_PRIVATE_API_KEY=12356abcefg
build.gradle
buildTypes {
debug{
buildConfigField("String", "GOOGLE_VERIFICATION_API_KEY", "\"" + MY_PRIVATE_API_KEY +"\"")
minifyEnabled false
applicationIdSuffix ".debug"
}
}
あなたはこのように参照するコードで
String myAPI = BuildConfig.GOOGLE_VERIFICATION_API_KEY;
そのキーをアプリケーションと一緒に配布したり、ソースコードリポジトリに格納したりすることは想定していません。この質問は、それを行う方法を尋ねていますが、それは通常行われることではありません。
Android/iPhoneの場合、アプリが最初に実行されるときに、デバイスは独自のWebサービスにKEYを要求する必要があります。その後、鍵は安全な場所に保管されます。キーが変更されたか、発行者によって取り消された場合。 Webサービスは新しいキーを公開できます。
ソフトウェアのライセンスを使用しているお客様は、ソフトウェアを最初に構成するときにキーを手動で入力する必要があります。全員に同じ鍵を与えることも、異なる鍵を与えることもできます。
ソースコードは公開リポジトリに保存しますが、KEYは保存しません。ファイルの設定で、行*place key here*を追加します。開発者がソースコードを使用すると、sample.cfg
ファイルのコピーが作成され、独自のキーが追加されます。
開発または本番で使用するyourconfig.cfg
ファイルをリポジトリに保存しません。
これは、ある時点で誰もが問題を抱えている問題だと思います。
これが私が使用したワークフローです。ひねりを加えた.gitignoreを使用します。
これで、構成リポジトリを任意の開発およびデプロイメントシステムに複製できます。スクリプトを実行してファイルを正しいフォルダーにコピーするだけで完了です。
すべてのGitHubキャンディーを引き続き入手し、コードを世界と共有します。機密データはメインリポジトリに存在しないため、公開されません。それらは、依然として、デプロイメントシステムから離れたプルとコピーにすぎません。
私はプライベートgitサーバーに年間15ドルのボックスを使用していますが、cheapskateの要件に応じて自宅でセットアップすることもできます;-)
PS:gitサブモジュール( http://git-scm.com/docs/git-submodule )を使用することもできますが、私は常にコマンドを忘れているので、ルールは素早く簡単です。
暗号化を使用しますが、起動時にマスターキーをコンソールのパスワードとして、プロセスのユーザーのみが読み取ることができるファイルで、またはMac OSキーチェーンやWindowsキーストアなどのシステム提供のキーストアから提供します。
継続的に配信するには、さまざまなキーをどこかに記録する必要があります。構成はコードから区別する必要がありますが、リビジョン管理下に置くことは非常に理にかなっています。
まだ言及されていない3つの戦略(?)
チェックイン時またはVCSの事前チェックインフック
すでに述べた戦略
ソース管理から個人情報を守ります。ロードされていない配布用のデフォルトを作成し、VCSに実際のデフォルトを無視させます。インストールプロセス(手動、構成/ビルド、ウィザード)は、新しいファイルの作成と入力を処理する必要があります。必要に応じて、ファイルの権限を変更して、必要なユーザー(webserver?)だけがファイルを読み取れるようにします。
利点:
既にこれを行っていて、誤ってチェックインしている場合は、プロジェクトの.gitignore
に追加してください。これにより、再度行うことができなくなります。
そこにはareプライベートリポジトリを提供する無料のGitホストがたくさんあります。資格情報をバージョン管理することはできませんが、安価でプライベートリポジトリを持つこともできます。 ^ _ ^