34
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Androidのリセマラを防ぐ

要約

MediaDrmを使ってリセマラを防ぎます

概要

Androidでリセマラ(リセットマラソン)を防ぐために、一意のIDを取得します。
ここでいうリセマラとは、アプリをアンインストール/インストールを繰り返して、初回限定の利益を何度も受ける行為を指します。

公式のドキュメント

リセマラのように何度もアプリを再インストールしてIDを作成することをシビル攻撃というらしいです。
そして、公式にも不正行為防止: 無料コンテンツ制限を適用し、シビル攻撃を検知するというドキュメントがあります。

GUID やインスタンス ID を使用すると、ユーザーがコンテンツ上限の適用を回避するにはアプリを再インストールしなければならなくなるため、ほとんどのユーザーに思いとどまらせることができます。

しかし、これで思いとどまらないのがリセマラという行為なので、もう一つある

APK ごとの識別子である Widevine ID を使用してコンテンツへのアクセスを制限できます。

この、Widevine IDを使ってリセマラを防いでみます。

Widevineとは

Widevineとは、デジタル著作権管理技術プロバイダーです。
他のデジタル著作権管理技術プロバイダーとして、MicrosoftではPlayReady、AppleではFairPlayというものがあり、WidevineはGoogleのデジタル著作権管理技術プロバイダーになります。

Widevine IDを取得する

Widevine IDを取得するために、MediaDrmというものを使います。

val widevineUuid = UUID.fromString("edef8ba9-79d6-4ace-a3c8-27dcd51d21ed")
val id = MediaDrm(widevineUuid).getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID)

といった感じに、MediaDrmをWidevineのUUIDで初期化して、MediaDrm.PROPERTY_DEVICE_UNIQUE_IDを取得することにより、端末固有のIDを取得できます。

本来であれば、暗号化されたコンテンツのメタデータを取得し、それにあったデジタル著作権管理技術プロバイダーを設定する使い方をするのがMediaDrmなのですが、今回の目的はWidevine IDなので、WidevineのUUIDを直接入れています。

ちなみにUUIDの参考先はこちらのサイトです。
https://dashif.org/identifiers/content_protection/

Widevine IDの挙動について

アンインストールして再インストールした場合

初回取得時と同じIDになります。

端末ID取得処理を別アプリに実装した場合

別アプリの場合、違うIDになります。

マルチユーザーの場合

Android同一端末でマルチユーザーの機能を利用している場合、どのユーザーに切り替えても同じIDになります。

まとめ

つかおう!MediaDrm!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
34
Help us understand the problem. What are the problem?