なみひらブログ

学んだことを日々記録する。~ since 2012/06/24 ~

Androidアプリでのセキュリティ情報の定義方法

背景

Androidアプリ開発にてセキュリティ情報(他サービスのAPIキーなど)を定義しますが、それらの情報はGithubなどのソースコード管理にコミットはしないほうがいいので、その定義方法を書いておきます。

定義方法

セキュリティ情報の定義

  • security.properties
    セキュリティ情報を記載するプロパティファイル。このファイルはコミットしない(要ignoreファイルに追記)。
    コミット防止観点からいうとできるだけ一箇所でまとめたい。サービスごとに分けるなら「security-{サービス}.properties」とかにして、「security-*」とかでignoreしたほうがいいかも。
    例:
# Fabric
fabric.api.key={実際の値をいれる}

# twitter
twitter.api.key={実際の値をいれる}
twitter.api.secret={実際の値をいれる}

セキュリティ情報(プロパティ)の取り込み

別の設定ファイルやソースコード等で利用するために、先に記載したプロパティ値を読み込む。
設定ファイルが参照したいときは「manifestPlaceholders」にいれる。
ソースコードから参照したいときは「buildConfigField」にいれる。※BuildConfigというファイルに設定値が書き出されるので、定義したらビルドが必要。(もちろんBuildConfigもコミットしてはいけない)
* build.gradle

・・・
Properties props = new Properties()
try {
    props.load(file('security.properties').newDataInputStream())
} catch (Exception ex) {
    throw new GradleException("can not load *.properties");
}
・・・

android {
    ・・・
    defaultConfig {
        ・・・
        manifestPlaceholders = [fabricApiKey: "${props.getProperty("fabric.api.key")}"];
        ・・・
    }
    buildTypes {
        debug {
            buildConfigField "String", "TWITTER_API_KEY", "\"${props.getProperty("twitter.api.key")}\""
            buildConfigField "String", "TWITTER_API_SECRET", "\"${props.getProperty("twitter.api.secret")}\""
            ・・・
        }
    }
    productFlavors {
    }
}
・・・

設定ファイルから値を利用する

登録した参照キーで参照できる。
* 例:AndroidManifest.xml

<meta-data
    android:name="io.fabric.ApiKey"
    android:value="${fabricApiKey}" />

ソースコードから値を参照する

登録した参照キーで参照できる。
* 例

public class MainActivity extends AppCompatActivity {
    ・・・
    # 参照しているところ
    private static final String TWITTER_API_KEY = BuildConfig.TWITTER_API_KEY;
    private static final String TWITTER_API_SECRET = BuildConfig.TWITTER_API_SECRET;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        # 利用しているところ
        final TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_API_KEY, TWITTER_API_SECRET);
        ・・・

まとめ

これが最適かどうかわかっていない(´・ω・`)