> For the complete documentation index, see [llms.txt](https://docs.payments.thalescloud.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.payments.thalescloud.io/nfc-wallet-sdk-android/ja/security-and-privacy/security-guidance.md).

# セキュリティガイダンス

## 概要

Android を構築・リリースする際には、このセキュリティガイダンスを使用してください **デジタルウォレットアプリケーション** NFC Wallet SDK を統合した

このガイダンスは、リリース前に適用する必要があるセキュリティガイドラインのセットです。

## 一般的なセキュリティガイドライン

### 最新の NFC Wallet SDK リリースを使用する

最新の NFC Wallet SDK リリースを使用してください。最新のセキュリティ更新と修正が含まれています。

### NFC Wallet SDK のリリースビルドを使用する

Google Play ストアに公開する前に、デジタルウォレットアプリケーションを次の設定で使用するよう構成します `リリース` ビルド。

{% hint style="warning" %}
この `Dev` SDK バリアントは本番環境では許可されません。
{% endhint %}

### デバッグシンボルを削除する

デバッグシンボルを付けたままリリースしないでください。この方法はリバースエンジニアリングの難度を高め、機密変数、構造、ロジックを容易に特定できないようにします。

### 機密データの漏えいを防ぐ

アプリケーションがバックグラウンドに移行する前に、UI から機密データを消去します。

アプリケーションがフォアグラウンドに戻るまで、データを暗号化するか消去します。

機密情報のログ出力は避けてください。

### コードの難読化を使用する

難読化を使用して、リバースエンジニアリングのコストを高めます。

### ネットワーク通信を保護する

デジタルウォレットのバックエンドへのすべてのネットワーク呼び出しに HTTPS を使用する。

自己署名証明書は避けてください。

証明書ピンニングを実装する場合は、次のガイドラインに従ってください。

* ホスト名をリーフ証明書と照合する。
* システムの信頼ストアに対して証明書チェーン全体を検証する。
* 期限切れの証明書は拒否する。
* ルート CA またはリーフ証明書の SHA-256 ハッシュをピン留めする。

個人を特定できる情報（PII）を含む機密データを送信する場合は、必要に応じてアプリケーションレベルの暗号化と認証を追加してください。

### RASP 保護を追加する

商用の Runtime Application Self Protection（[RASP](https://en.wikipedia.org/wiki/Runtime_application_self-protection)）ソリューションを使用する。

以下を検出し、対応する：

* ルート化または脱獄。
* デバッグ。
* フック。
* アプリ改ざん。
* エミュレーター実行。

### ログ記録

機密データをデバイスのログに書き込まないでください。

ビルドフラグを使用して、本番環境ビルドからデバッグログを除外します。

Android では、ログは共有リソースであり、次の権限でアクセスできます `READ_LOGS` 権限があり、ユーザーの機密情報を不適切にログ出力すると、他のアプリケーションへの意図しないデータ漏えいにつながる可能性があります。

### 安全なコーディング手法を採用する

開発全体を通して安全なコーディング手法を適用してください。例えば、次のことを行うべきです：

* 入力検証を実施する。
* メモリを適切に管理する。
* 安全な C 関数を使用する。
* 機密データの保存に不変コンテナの使用を避ける。

基本チェックリストについては、OWASP [セキュアコーディングの実践](https://owasp.org/www-project-secure-coding-practices-quick-reference-guide).

を参照してください。これらの手法は、PMD や HP Fortify などの静的コード解析ツールで強制できます。

### 監査と侵入テストを実施する

脆弱性を特定し、アプリケーション全体のセキュリティ態勢を評価するために、アーキテクチャおよびコードの監査に加えて侵入テストを実施します。

### アプリケーションセキュリティの耐性を評価する

OWASP MASVS（Mobile Application Security Verification Standard）を次で確認してください： [OWASP MASVS](https://github.com/OWASP/owasp-masvs)。これはモバイルアプリケーションのセキュリティ要件のベースラインです。

OWASP MSTG の使用を強く推奨します [チェックリスト](https://github.com/OWASP/owasp-mastg/releases/latest) を使用して、アプリケーションのセキュリティレベルを評価してください。

## Android 開発者向けセキュリティガイドライン

リリース前に、詳細で多層防御の推奨事項については Android のセキュリティガイダンスを使用してください。

次のトピックを確認してください：

* [アプリケーションレベルの保護](#application-level-protection)
* [データ保護](#data-protection)
* [認証](#authentication)
* [暗号化ガイドライン](#cryptography-guidelines)
* [アプリケーションのハードニング](#application-hardening)
* [安全なコーディング](#secure-coding)

{% hint style="info" %}
このガイダンスの追加参照として、Android の基本セキュリティチェックリストを使用してください： [Android セキュリティチェックリスト](https://developer.android.com/training/articles/security-tips).
{% endhint %}

### アプリケーションレベルの保護

#### アプリケーションのインストーラーを検証する

実行時にデジタルウォレットアプリケーションのインストーラーパッケージ名を検証します。

Google Play からのインストールのみを信頼してください。Google Play は `com.android.vending`.

を使用します。これは、サイドチャネル配布やサードパーティソースからの不正なインストールを防ぐためです。

#### セキュリティ更新を強制する（アプリケーションの強制更新）

セキュリティ修正がある場合は、アプリケーションの強制更新を確実に行ってください。

* インストールされたバージョンが許可される最小バージョンを下回る場合は、サービスへのアクセスをブロックします。

#### リソースを内部ストレージに保存する

あなたの **デジタルウォレットアプリケーション** とそのリソースを内部ストレージに保持してください。これにより、man-in-the-disk（MITD）攻撃のリスクが低減します。MITD 攻撃では、攻撃者が外部ストレージに保存されたファイルを改変または操作する可能性があります。

アプリケーションは、次の属性を使用して外部ストレージに移動されることを許可してはなりません `android:installLocation` マニフェスト属性。

#### SDK 対応の OS バージョンをサポートする

あなたの **デジタルウォレットアプリケーション** は、NFC Wallet SDK がサポートする OS バージョンでのみ実行してください。これにより、古いデバイスでの機能上の問題やセキュリティの欠落が減少します。また、 **エンドユーザー** 体験も向上します。

#### デバイスのロックスクリーンを必須にする

デバイスに画面ロックが設定されていることを必須にします。PIN、パターン、またはパスワードを使用してください。画面ロックが設定されていない場合は、機密フローをブロックします。

```java
KeyguardManager keyguardManager =
        (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);

boolean isDeviceSecure = keyguardManager != null && keyguardManager.isDeviceSecure();

if (!isDeviceSecure) {
    // フローをブロックする。
    // Android 設定で画面ロックを有効にするようエンドユーザーに促します。
}
```

#### 過剰な権限を防ぐ

あなたのために必要な Android 権限のみを宣言してください **デジタルウォレットアプリケーション**.

不要な権限は攻撃対象領域を広げ、特権データを露出させる可能性があります。

#### エクスポートされたコンポーネントを制限する

Android アプリケーションは次のコンポーネントで構成されます：

* アクティビティ
* サービス
* ブロードキャストレシーバー
* コンテンツプロバイダー

次の点を考慮してください：

* アプリケーション間通信はリスクが高いものとして扱う。
* すべてのエクスポートされたコンポーネントを、あなたの **デジタルウォレットアプリケーションへの公開エントリポイントとして扱い、** それにより、リスクや攻撃への露出が高まります。

アプリケーションは

* 公開されるメインアクティビティのみで設計することを推奨します。
* その他のすべてのコンポーネントには、明示的に次の属性を指定する必要があります `export=false`.

公開するコンポーネントについては、カスタム権限で保護することを検討してください。

#### リリースビルドでデバッグを無効にする

あなたの `リリース` ビルドが **デジタルウォレットアプリケーション** デバッグ可能ではないことを確認してください。

次のことを行う必要があります：

* 設定します `android:debuggable="false"` 〜上で `<application>` 要素を `AndroidManifest.xml`.
* そして最終 APK がデバッグ可能でないことを確認します。

最終 APK を検証するには：

1. 次を実行します：

   ```bash
   aapt dump xmltree <myApplication.apk> AndroidManifest.xml
   ```
2. 出力で、 `<application>` 要素を見つけます。 `android:debuggable` が次に設定されていることを確認します `0x0`.

この検証を CI パイプラインの一部として自動化してください。

#### アプリリンクとディープリンクを評価する

ディープリンクとアプリリンクは、アプリケーションの攻撃対象領域を拡大する可能性があります。リンクのハイジャックや、機密機能の意図しない露出などのリスクを導入する可能性があります。動作は Android バージョンによって異なります：

* Android 12（API レベル 31）より前では、アプリケーションに検証不可能なリンクが含まれている場合、そのアプリケーションに対するすべての Android App Links がシステムによって検証されない可能性があります。
* Android 12（API レベル 31）以降では、アプリケーションは攻撃対象領域が縮小される恩恵を受けます。Web インテント内の特定のドメインに対して対象アプリケーションが承認されていない限り、Web インテントはエンドユーザーの既定ブラウザーアプリケーションに解決されます。

すべてのディープリンクを列挙します。正しい Web サイトとの関連付けを検証します。

ディープリンクとアプリリンク経由で公開されるすべての操作をテストします。

すべての入力データを常に検証してください。すべての入力を信頼できないものとして扱います。検証により、アプリケーションは想定どおりのデータのみを処理するようになります。

#### スクリーンショットとアプリプレビューを防ぐ

設定します `FLAG_SECURE` を機密データを表示するすべてのアクティビティに設定します。これにより、フォアグラウンドでのスクリーンショットによる機密データの漏えいを防ぎます。

UI を描画する前に、 `Activity.onCreate()` でフラグを追加します：

```java
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
```

また、アクティビティ内の機密情報も `onPause()` メソッドで消去してください。

#### 適切なアプリ署名

リリース APK に次の署名を付けます：

* 広範な Android 互換性のための APK Signature Scheme v1 および v2。
* Android 9（API レベル 28）以降をターゲットにする場合は APK Signature Scheme v3。

{% hint style="info" %}
APK の署名鍵はあなたの管理下に置いてください。共有しないでください。
{% endhint %}

次を使用して署名を検証します `apksigner` Android SDK Build Tools から：

```bash
$ apksigner verify --verbose Desktop/example.apk
v1 スキーム（JAR 署名）を使用して検証済み: true
v2 スキーム（APK Signature Scheme v2）を使用して検証済み: true v3 スキーム（APK Signature Scheme v3）を使用して検証済み: true 署名者数: 1
```

#### アプリケーションデータのバックアップを防ぐ

あなたの **デジタルウォレットアプリケーション**.

設定します `android:allowBackup="false"` 〜上で `<application>` 要素を `AndroidManifest.xml`.

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        android:allowBackup="false">
    </application>
</manifest>
```

デフォルトでは、 `android:allowBackup` である `true`。これにより、OS はアプリケーションデータをバックアップおよび復元できます。これにはセキュリティ上の影響がある可能性があります。

バックアップ機能により、USB デバッグが有効な場合にエンドユーザーがアプリケーションデータをコピーできる場合もあります。

一度エクスポートされると、データはアプリのサンドボックスの外で検査できます。

#### 機密画面でのアクセシビリティを制限する

Android のアクセシビリティサービスは UI コンテンツを読み取ってアクションをトリガーできます。これは障害のあるユーザーにとって不可欠です。また、マルウェアが機密データを取得するために悪用することもできます。

画面ごとに、アクセシビリティサービスが機密コンテンツにアクセスすべきかどうかを判断してください。アクセシビリティイベントを通じたデータ漏えいを減らすために、以下の技術を使用してください。

{% hint style="warning" %}
アクセシビリティをブロックすると、一部の **エンドユーザー** があなたの **デジタルウォレットアプリケーション**を使用できなくなる可能性があります。これらの制御は、本当に機密性の高い画面にのみ適用してください。
{% endhint %}

**有効なアクセシビリティサービスを検出する**

アクセシビリティサービスが有効かどうかを確認します。必要に応じて、サービスが有効な場合に特定のフローを制限します。

**アクセシビリティサービスを許可リスト化する**

Android API を使用して、有効なサービスを一覧表示します。リスクポリシーに基づいて許可リストまたは拒否リストを維持します。許可されていないサービスが有効な場合は、 **エンドユーザー** に警告するか、操作をブロックします。

**ビューのアクセシビリティをブロックする**

ビューのサブツリーに対してアクセシビリティを無効にできます。これにより、そのビューと子ビューからのアクセシビリティイベントが防止されます。

```java
private void disableAccessibilityEvents(View view) {
    ViewCompat.setImportantForAccessibility(
        view,
        ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
    );
}
```

**アクセシビリティイベントで機密テキストが露出しないようにする**

デフォルトでは、Android は最後に入力された文字をマスクする前に短時間表示する場合があります。これにより、部分的な入力（たとえば、 `***1`）がアクセシビリティサービスに露出する可能性があります。これがあなたの脅威モデルで許容できない場合は、文字を即座にマスクしてください。

{% code expandable="true" %}

```java
private fun hideLastDigit() {
    transformationMethod = SecureTransformationMethod()
}

class SecureTransformationMethod : PasswordTransformationMethod() {
    override fun getTransformation(source: CharSequence?, view: View?): CharSequence {
        if (source == null) return SecureCharSequence("")
        return SecureCharSequence(source)
    }

    class SecureCharSequence(private val charSequence: CharSequence) : CharSequence {
        override val length: Int
            get() = charSequence.length

        override fun get(index: Int): Char {
            return 'x'
        }

        override fun subSequence(startIndex: Int, endIndex: Int): CharSequence {
            return SecureCharSequence(charSequence.subSequence(startIndex, endIndex))
        }
    }
}
```

{% endcode %}

#### オーバーレイ攻撃を防ぐ

Android のオーバーレイにより、1 つのアプリケーションが別のアプリケーションの上に UI を描画できます。これにより、フィッシングやデータ窃取が可能になります。これはオーバーレイ攻撃でよく使われる手法です。

フィッシングの例：攻撃者があなたの **デジタルウォレットアプリケーション**の上に全画面オーバーレイを描画します。オーバーレイはログイン画面または PIN 画面を装います。これにより、エンドユーザーの資格情報を盗まれる可能性が高まります。

ログイン、PIN 入力、プロビジョニングなどの機密画面と入力を保護します。

**Android 12（API レベル 31）以降**

呼び出します `setHideOverlayWindows(true)` を機密ビューに設定します。これにより、それらのビューに対する非システムオーバーレイがブロックされます。

**Android 2.3（API レベル 9）から Android 11（API レベル 30）まで**

機密ビューにタッチフィルタリングを使用します。これにより、オーバーレイによって隠されたタッチを検出しやすくなります。

次のオプションのいずれかまたは複数を使用します：

* 有効にする `setFilterTouchesWhenObscured(true)` を機密ビューに対して設定します。
* オーバーライドする `onFilterTouchEventForSecurity()` を使用して、隠されたタッチイベントを拒否します。
* でタッチイベントを確認します `onTouch()` を使用し、隠されたイベントを拒否します。

{% hint style="warning" %}
タッチフィルタリングは、すべてのオーバーレイ手法をカバーするわけではありません。一部のオーバーレイはタッチイベントの転送を回避できます。これを完全な解決策ではなく、多層防御として扱ってください。
{% endhint %}

詳細については、次を参照してください [Android オーバーレイ攻撃からの保護](https://www.guardsquare.com/blog/protecting-against-android-overlay-attacks-guardsquare).

#### 独自キーボードを使用する

機密入力にサードパーティ製キーボードを使用しないでください。サードパーティ製キーボードは、ユーザーが **エンドユーザー** 入力した内容を捕捉できる場合があります。

あなたの **デジタルウォレットアプリケーション**でのみ利用可能な独自キーボードを使用してください。PIN、パスコード、パスワード、および個人を特定できる情報（PII）に使用します。

独自キーボードを実装できない場合は、パスコード入力用に専用の PIN パッドを使用します。セッションごとにキー配置をランダム化してください。これにより、のぞき見のリスクが低減します。また、一部のアクセシビリティマルウェアの影響も軽減できます。

### データ保護

#### 送信中のデータを保護する

あなたの **デジタルウォレットアプリケーション** とあなたの **イシュアのバックエンドが**.

を介したすべてのネットワーク通信に TLS 1.2 または TLS 1.3 を使用してください **イシュアのバックエンドが** 強力な暗号スイートを使用するように構成します。

さらに：

* 実装する **証明書ピンニング** あなたの **デジタルウォレットアプリケーション**.

  Android 7.0（API レベル 24）以降では、 [ネットワークセキュリティ構成](https://developer.android.com/training/articles/security-config) を使用して、アプリケーションが呼び出すドメインをピン留めします。
* 追加する **アプリケーションレベルの暗号化と認証** を TLS の上に追加して、あなたの **デジタルウォレットアプリケーション** とあなたの **イシュアのバックエンドが**.

#### 保存データを保護する

アプリケーションのサンドボックス内であっても、デバイスに保存された機密データを保護します。

侵害されたデバイスでは、ローカルストレージがマルウェアにさらされる可能性があると想定してください。

静止時の機密データは、デバイスに紐づいた鍵を使用して暗号化し、完全性を保護し、アクセス前にエンドユーザー認証を必須にすることを推奨します。

静止時のすべての機密データを暗号化するには、アプリケーションは次を使用できます

* AndroidX Security Crypto `EncryptedSharedPreferences` キー・バリューデータ用。
* AndroidX Security Crypto `EncryptedFile` ファイル用。

詳細については、Android の次のガイダンスを参照してください [データストレージ](https://developer.android.com/topic/security/data).

### 認証

#### 生体認証をサポートする

この **デジタルウォレットアプリケーション** エンドユーザー認証のために生体認証をサポートする必要があります。

生体認証が利用できない場合は、デバイス資格情報（キーロック）のフォールバックを提供してください。

Android Keystore と `BiometricPrompt` の暗号オブジェクトを可能な場合は使用します。

これにより、鍵がデバイスに紐づけられ、生体認証登録の変更が検出されます。

#### 多要素認証を強制する

あなたの **デジタルウォレットアプリケーション**.

機密操作に対して多要素認証（MFA）を強制します

MFA は、アクセス前に 2 つ以上の認証要素を要求することで保護を追加します。

### 暗号化ガイドライン

#### Google Play セキュリティプロバイダーを最新に保つ

次を使用します: [Google Play サービスのセキュリティプロバイダー](https://developer.android.com/training/articles/security-gms-provider) を、OS 更新が適時に届かないデバイスで暗号化と TLS の修正を受け取るために使用します。

NFC Wallet SDK は、このプロバイダーのインストール、更新、またはプロンプト表示を行いません。あなたの **デジタルウォレットアプリケーション** は、Google Play サービスのセキュリティプロバイダーがインストールされ、 **エンドユーザーの** デバイス上で最新であることを確認する責任があります。

#### 安全な乱数を使用する

使用する `java.security.SecureRandom` すべてのセキュリティに敏感な乱数生成に使用する（機密性の高い暗号鍵の生成や、任意のランダムデータ生成など）。

Android 10（API レベル 29）以降では、 `SecureRandom.getInstanceStrong()` を、利用可能な最も強力な乱数ソースが必要な場合に使用することを推奨します。

### アプリケーションのハードニング

#### root 化されたデバイスを検出する

NFC Wallet SDK を初期化する前、および機密操作を実行する前に、侵害されたデバイス環境（たとえば、ルート化フレームワークや `su` バイナリ）を検出します。

OWASP MSTG のガイダンスを参照してください [Android のリバースエンジニアリング対策](https://github.com/OWASP/mastg/blob/master/Document/0x05j-Testing-Resiliency-Against-Reverse-Engineering.md).

#### フック試行を検出する

フックは実行時にコードをあなたの **デジタルウォレットアプリケーション** へ注入します。攻撃者はこれを使用して、機密データ（たとえば暗号鍵や PII）を傍受したり、セキュリティ制御をバイパスしたり、アプリケーションロジックを変更したりします。

OWASP MASVS を参照してください： [Android のリバースエンジニアリング対策](https://mas.owasp.org/MASTG/0x05j-Testing-Resiliency-Against-Reverse-Engineering/) / *ランタイム完全性検証***.**

#### デバッガーのアタッチを検出する

侵害されたデバイスでは、攻撃者はデバッガーをある対象にアタッチできます `リリース` ビルドが **デジタルウォレットアプリケーション**。これにより、Java/Kotlinコードとネイティブライブラリをステップ実行で調査でき、機密ロジックやデータが露出する可能性があります。

Java/Kotlinコードとネイティブコードの両方で、特に機密性の高いフローを実行する前に、デバッガーのアタッチを検出してください。詳細については。

OWASP MASVS を参照してください： [Android のリバースエンジニアリング対策](https://mas.owasp.org/MASTG/0x05j-Testing-Resiliency-Against-Reverse-Engineering/) / *アンチデバッグ*.

#### エミュレーターを検出する

エミュレーターは信頼できない実行環境です。攻撃者による動的解析やインスツルメンテーションを容易にします。

エミュレーターでの実行はできるだけ早く検出してください。アプリケーションの起動時、および NFC Wallet SDK を初期化する前に行ってください。

OWASP MASVS を参照してください： [Android のリバースエンジニアリング対策](https://mas.owasp.org/MASTG/0x05j-Testing-Resiliency-Against-Reverse-Engineering/) / *エミュレーター検出。*

#### アプリケーション改ざんを検出する

〜を検証して改ざんを検出する **デジタルウォレットアプリケーション** 実行時に署名証明書のハッシュを検証します。

このチェックは、攻撃者がバイナリやリソースを改変してからAPKに再署名するリパッケージング攻撃の検出に役立ちます。攻撃者はあなたの署名証明書を再現できません。

期待される証明書ハッシュを難読化し、特定や改変を困難にします。

背景については、次を参照してください [改ざん防止技術を実装する](https://github.com/nowsecure/secure-mobile-development/blob/master/en/coding-practices/anti-tamper-techniques.md).

必要に応じて、署名証明書のハッシュをあなたの **バックエンド**に送信します。〜からのリクエストを受け入れる前に、サーバー側で検証します **デジタルウォレットアプリケーション**.

#### アプリケーションを難読化する

あなたの **デジタルウォレットアプリケーション** およびそのコンポーネントを難読化します。これによりリバースエンジニアリングのコストが上がります。また、機密ロジックやデータの場所を特定しにくくなります。

NFC Wallet SDK がすでに DexGuard で難読化されている場合でも、Thales NFC Wallet SDK の公開 API は難読化する必要があります:

* SDKパッケージに付属する ProGuard/R8 ルールが適用されていることを確認してください。

  参照 [NFC Wallet SDK の難読化](/nfc-wallet-sdk-android/ja/security-and-privacy/nfc-wallet-sdk-obfuscation.md)
* パッケージの平坦化ルールに特に注意してください:

  ```bash
  -flattenpackagehierarchy util
  ```

パッケージ名 `util` を使用して、難読化の出力をSDKルールと一致させます。

商用の難読化ツールがあります。Androidでは、〜を推奨します *DexGuard*.

OWASP MASVS を参照してください： [Android のリバースエンジニアリング対策](https://mas.owasp.org/MASTG/0x05j-Testing-Resiliency-Against-Reverse-Engineering/) / *難読化*.

### 安全なコーディング

#### **メモリから機密データを消去する**

機密データ（たとえば暗号鍵や個人識別情報（PII））はバイト配列に保存します。

Javaでは、のような不変オブジェクトを確実に消去することはできません `String` と `StringBuilder`。また、メモリ内にいくつのコピーが作成されるか、またそれらがどれくらいの間参照可能なままであるかも制御できません。

機密データは明示的に消去してください。ガベージコレクターに頼らないでください。

〜を使用してください `finally` ブロックを使って機密バッファを消去してください。たとえ〜がない場合でも `catch` ブロック。例外が発生した場合の漏えいリスクを低減できます。

{% code expandable="true" %}

```java
byte[] password = this.getUserPassword();
try {
  // パスワードを使ってログインする
  this.logUserIn(password);
} finally {
  	// ここに例外キャッチがなくても、
  	// 実行されるべきRuntimeExceptionがこのfinallyブロックを発火させる場合があります
  	// 実行されます
  MemoryHelper.clearData(password);
}

// バイト配列の消去メソッドを実装する1つの方法は、MemoryHelper内の配列のすべての要素を書き換えることです
class public static void clearData(byte[] baBuffer) {
  if (baBuffer == null)
    return;
  for(i = 0;  i < baBuffer.length; i++) {
    baBuffer[i] = (byte)0;
  }
}

```

{% endcode %}

#### セキュアコーディング標準に従う

Apple、Google、OWASP（Open Web Application Security Project）などの信頼できるソースのセキュアコーディング標準に従ってください。

Thales の内部ガイダンスが必要な場合は、Thales Handset Security Community に連絡してアクセスを申請してください。

これらの標準は、PMD や Fortify などの静的コード解析ツールで強制してください。回帰を防ぐため、CI パイプラインに追加してください。

#### Android lint チェックを実行する

開発中および各リリース前に Android Lint を実行してください。セキュリティと品質のリスクを減らすため、指摘事項は早めに修正してください。

Android Lint は静的解析ツールです。プロジェクトの正確性、セキュリティ、パフォーマンス、使いやすさ、アクセシビリティ、国際化の問題をチェックします。

lint はローカルおよび CI パイプラインで実行してください:

```bash
./gradlew lint
```

詳しくは Android 開発者向けサイトを参照してください: [lint チェックでコードを改善する](https://developer.android.com/studio/write/lint).

## 資産を保護する

このセクションでは、資産を保護するためのアプリ開発におけるベストプラクティスを示します。

### **アクティベーションコード**

有効期間が限られたカードトークン化で使用します:

* 短命のシークレットとして扱います。ログ出力したり保存したりしないでください

### FCM 登録トークン

デジタルウォレットアプリケーションがアプリレベルで FCM を管理する場合:

* FCM 登録トークンを必要以上に永続化しないでください。

### **チャージカード情報**

デジタルウォレットアプリケーションが決済カードデータを収集する場合:

* 危険な `EditField` 自動補完、コピー、貼り付けなどのオプションを無効にします。
* 安全なキーパッドを使用してください。
* 使用前に入力を検証してください。
* 決済カードデータを永続的に保存しないでください。
* 入力画面を表示する前に、実行時チェック（root化、フック、デバッグ、改ざん検出）を適用してください。
* この資産の機密性と完全性を確保してください。

アプリ外から取得されるその他の機密入力にも同じ制御を適用してください。

### アプリ署名証明書と TLS 証明書

* アプリ署名証明書へのアクセスを制御してください。
* 信頼できない相手に開示しないでください。
* この資産の機密性と完全性を確保してください。

### **QR / DSRP 入力データ（金額）**

デジタルウォレットアプリケーションが金額を収集する場合:

* 危険な `EditField` 自動補完、コピー、貼り付けなどのオプションを無効にします。
* 安全なキーパッドを使用してください。

アプリ外から取得されるその他の機密入力にも同じ制御を適用してください。

### QRコード（2次元バーコード）

スクリーンショットでのQRコードのキャプチャや、非セキュアなディスプレイでの表示を検出・防止するようにアプリを実装する必要があります。

### その他の機密資産

* バイナリに含まれるコードを難読化し、機密文字列を保護します。
* 各リリースで資産を再評価してください（新機能により新たな機密データが追加される可能性があります）。
  * 各資産の価値と重要性を評価し、必要な保護を適用してください。
* 一時的なデータを永続化しないでください。不要になったらメモリから機密データを消去してください。
* デバイスは常に信頼できないものとみなしてください。RASP を使用して、実行時にアプリケーションバイナリとサードパーティライブラリを保護するのに役立ててください。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.payments.thalescloud.io/nfc-wallet-sdk-android/ja/security-and-privacy/security-guidance.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
