この情報は、安全でない暗号化パターンが含まれているアプリのデベロッパーを対象としています。該当するアプリは、暗号テキストの生成に使われている秘密鍵、ソルト、または初期化ベクトル(IV)が「静的に計算された」ものであるアプリです。安全でない暗号化に該当する箇所は、アプリの Play Console 通知で確認できます。
「安全でない暗号化パターン」の通知に対する修正方法
該当のアプリを調べて、静的に計算された鍵、初期化ベクトル、ソルトのいずれかが暗号化操作で使用されていることを確認し、そうした値が必ず安全に作成されるようにします。たとえば、以下のコードでは、静的に計算可能な秘密鍵と初期化ベクトルが使われています。 // Console 通知でこのメソッドを参照
public byte[] encryptionUtil(String key, String iv, byte[] plainText) {
Cipher cipher = Cipher.getInstance(“AES/GCM/NoPadding”);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), “AES”);
GCMParameterSpec paramSpec = new GCMParameterSpec(256, iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec);
return cipher.doFinal(plainText);
}
// こちらの鍵と初期化ベクトルは安全でないため変更が必要
byte[] cipherText = encryptionUtil(“abcdef...”, “010203040506”, plainText);
静的に計算された値
「静的に計算される」値は、アプリの実行のたびに毎回同じ値になります。暗号値が静的に計算されたものである場合、アプリから抽出されてアプリの暗号化データの攻撃に利用されるおそれがあります。鍵や初期化ベクトル、ソルトを使用する前に複雑な方法で処理したとしても、そうした処理がプログラムの実行のたびに毎回同じであれば、安全でないことには変わりありません。
Android でのおすすめの方法
Jetpack Security を対称暗号化に使用することをおすすめします。アプリで API キーや個人情報(PII)などの機密データを暗号化する場合、EncryptedSharedPreferences を利用すると、秘密鍵や初期化ベクトル、ソルトの実装を気にせずに、そうしたデータを安全に保存できます。この他にも、さまざまなおすすめの方法と例をこちらのページでご覧になれます。他のシステムにデータを安全に送信するためには、TLS/SSL を使用して送信データを保護する必要があります。
Jetpack Security では、Google のオープンソース プロジェクト Tink を利用して、対称認証方式による暗号化を処理します。レベルの低い暗号化操作に関して高度な対応が必要となるような場合は、Tink を直接使用することをおすすめします。
前述した Android でのおすすめの方法では現状に対応できず、鍵や初期化ベクトル、ソルトを明示的に管理する必要がある場合には、以下の基準に準拠することをおすすめします。
- 秘密鍵: 対称暗号方式の秘密鍵は、予測不可能かつ非公開でなければなりません。ローカルデータの暗号化については、暗号による安全なランダム性を利用して(または、PBEKeySpecs を使用する場合はユーザーの生成したデータから)秘密鍵を作成し、AndroidKeystore を使って保存する必要があります。
- 初期化ベクトル: 初期化ベクトルは、複数のメッセージにおいて一意かつ予測不可能なものでなければなりませんが、非公開である必要はありません。初期化ベクトルの作成には必ず、暗号による安全なランダム性を利用してください。また、初期化ベクトルの保存や送信は、関連する暗号テキストと一緒に行う必要があります。
- ソルト: ソルトは、複数のハッシュにおいて一意かつ予測不可能なものでなければなりませんが、非公開である必要はありません。ソルトの作成には必ず、暗号による安全なランダム性を利用してください。また、ソルトの保存や送信は、関連するハッシュと一緒に行う必要があります。
次のステップ
- 上記の手順に沿ってアプリを更新します。
- Play Console にログインして、アプリの更新版を送信します。