この記事は レコチョク Advent Calendar 2025 の19日目の記事となります。
こんにちは。レコチョクで Android / NFC を中心にモバイルアプリ開発をしている齋藤です。
コロナ禍で聴くようになった ANTENA というアーティストが、好きになってから活動休止を知り残念に思っていました。
しかし、今年1月より復活となり、同じ宮城出身でということもあり親近感があったので、新宿 Loftでの復活無料ワンマンを皮切りにライブへ足を運ぶ日々を送っています。
最近、私が担当するサービスでNFCタグを用いた物理とデジタルを連携を実装する機会があり、NTAG215仕様と向き合うことになりました。
NTAG215とは
NTAG215 は、NXP Semiconductors が製造する NFC Forum Type 2 Tag 規格に準拠した NFCチップです。
NXP の旧製品である MIFARE Ultralight の系譜を継ぐチップで、NTAG215の他に、メモリサイズ違いのNTAG213やNTAG216といったバリエーションが提供されています。
NTAGシリーズは、安価で手に入れやすく実際に Amiibo やホテルルームキーといったサービスでも利用されています。
この記事で扱う内容
NTAGシリーズのよくある用途としては、URLやテキストを書き込むケースが多いと思いますが、タグ自体の振る舞いを制御するための機能を知る機会がありましたので紹介したいと思います。本記事では中容量モデルである NTAG215 を中心とした解説となります。
NTAG215 の設定領域のうち、保護されたタグ構成を実現するために必須となる設定領域(CC / Lock Bytes / AUTH0 / ACCESS / PWD)を整理します。
目次
- NTAG215 の設定領域だけを抜き出したメモリマップ
- Capability Container(CC)
- Static Lock(静的ロック:Page 2)
- Dynamic Lock(ダイナミックロック:Page 130 / 0x82)
- AUTH0(Page 131 / 0x83:認証が必要になる開始ページ)
- ACCESS(Page 132 / 0x84:PROT / AUTHLIM / CFGLCK)
- PWD(パスワード)と PACK(認証応答値)
- 保護構成の実例
- NFC Tools での設定手順
- 設定の確認
- まとめ
NTAG215 の保護設定を行う上で押さえておきたいポイントをまとめました。
1. NTAG215 の設定領域だけを抜き出したメモリマップ
まずは情報を整理するために、設定に関係するページだけを表にまとめます。
| Page | Addr | 主な内容 | 説明 |
|---|---|---|---|
| 02 | 0x02 | Static Lock Bytes + OTP | ページ4〜15の不可逆ロック |
| 03 | 0x03 | Capability Container (CC) | NFC Forum Type 2 定義 |
| 04 | 0x04 | ユーザー領域 | NDEF or RAWデータで任意のデータを書き込める |
| ・ | ・ | ・ | ・ |
| ・ | ・ | ・ | ・ |
| ・ | ・ | ・ | ・ |
| 129 | 0x81 | ユーザー領域 | NDEF or RAWデータで任意のデータを書き込める |
| 130 | 0x82 | Dynamic Lock Bytes | ページ16〜129を範囲ロック |
| 131 | 0x83 | AUTH0 | 認証が必要になる開始ページ |
| 132 | 0x84 | ACCESS(PROT / AUTHLIM / CFGLCK) | 認証動作の詳細設定 |
| 133 | 0x85 | PWD | 4バイトのパスワード |
| 134 | 0x86 | PACK | 認証成功応答値(2バイト) |
これらの設定領域を理解すれば、NTAG215 の「保護設定」はほぼ把握できます。
2. Capability Container(CC)
CC(Capability Container)は Page 3(0x03)に配置され、タグの基本情報を定義します。
| Byte | 意味 | 例 |
|---|---|---|
| 0 | Magic Number | 0xE1 |
| 1 | Version | 0x10 |
| 2 | Data Area Size | 0x6D |
| 3 | Read/Write Access | 0x00(RW可) |
Byte3 はタグの読み書き権限を示す領域です。書き込み不可として扱いたいタグには、NFC Forum の仕様に従い 0x0F を設定しておくのが無難です。
ただし、私がブランクタグを用意し検証した限りでは、0x00 → 0x0F で上書きしても、タグのユーザー領域への write は依然として可能でした。つまり、この値を設定しても書き込み自体が物理的に不可能になるわけではなく、リーダー側に「書き込み不可である」ことを示すフラグとして機能するのだと推測しています。
NFC Forum でこの設定値について具体的な説明の記述は見つけられませんでしたが、ReadOnly を示すタグがお作法に則っているのであれば、リーダーは直接 write を実行せずとも、この値を参照して書き込み可否を判断できると思います。
3. Static Lock(静的ロック:Page 2)
Static Lock は Page 4〜15(0x04〜0x0F)の書き込みを不可逆に制御する領域です。 該当ビットを 1 に設定すると、対応するページは 永久に書き換え不可(Read-only) になります。
Static Lock の影響範囲

Static Lock の注意点
- 誤設定すると復旧不能(不可逆)
- Page 4〜15 は主に NDEF の最初の領域に相当し、アプリ動作に影響しやすい
Static Lock は影響範囲が狭い(Page 4〜15)ため、ユーザー領域の先頭部分だけをロックしたい場合に有効です。 ただし、次章で説明する Dynamic Lock の方が広域を一括管理できるため、全体をロックする際は Dynamic Lock との併用を検討してください。
4. Dynamic Lock(ダイナミックロック:Page 130 / 0x82)
Dynamic Lock は Page 16〜129(0x10〜0x81)を管理するロックで、16ページ単位で制御できます。
Static Lock よりも広い範囲をまとめてロックできますが、こちらも不可逆である点は同じです。
Dynamic Lock Byte0 のビット構成
| bit | ロックされるページ範囲 |
|---|---|
| 0 | 0x10 – 0x1F (16–31) |
| 1 | 0x20 – 0x2F (32–47) |
| 2 | 0x30 – 0x3F (48–63) |
| 3 | 0x40 – 0x4F (64–79) |
| 4 | 0x50 – 0x5F (80–95) |
| 5 | 0x60 – 0x6F (96–111) |
| 6 | 0x70 – 0x7F (112–127) |
| 7 | 0x80 – 0x81 (128–129) |
ロック例:Byte0 = 0x3C(0011 1100b)の場合

Dynamic Lock の実務ポイント
- 書き込み処理がすべて完了してからロックする
- Page 16〜129 のほぼ全領域を保護可能
- Static Lock より広い範囲を安全に管理できる
5. AUTH0(Page 131 / 0x83:認証が必要になる開始ページ)
AUTH0 は、どのページ以降をパスワード認証が必要な領域とするかを定義します。
例:AUTH0 = 0x20 の場合
Page 32(0x20)〜 Page 134(0x86)が認証必須となります。
AUTH0 の視覚化(AUTH0 = 0x20 の場合)

AUTH0 の注意点
0x04 など小さい値にするとほぼ全域が認証必須になり、運用上のリスクが高まります。保護したい領域に応じて適切な値を設定してください。
6. ACCESS(Page 132 / 0x84:PROT / AUTHLIM / CFGLCK)
ACCESS は、認証動作の詳細ルールを定義します。
| フィールド | 説明 | 値 |
|---|---|---|
| PROT | AUTH0で設定された領域の保護設定 | 0b: 書き込みのみ保護 |
1b: 読み書き両方保護 |
||
| AUTHLIM | パスワード認証失敗の許容回数。超過したら領域がロックされる | 000b:回数制限なし |
001b〜111b:試行回数1〜7回 |
||
| CFGLCK | 0x83, 0x84の保護設定 | 0b:書き込み可能 |
1b:書き込み不可 |
ACCESS 設定で最も重要なポイント
- PROT = 1:パスワードを突破しない限りユーザーデータの読み取りが不可
- AUTHLIM ≠ 0:パスワード認証失敗回数に上限を設定。上限を超過すると ロックアウト(永久的にアクセス不能な状態) となり、正しいパスワードでも復旧できなくなる。総当たり攻撃対策として有効
- CFGLCK = 1:取り返しがつかないが、AUTH0 / ACCESS をロックし設定自体を保護できる
7. PWD(パスワード)と PACK(認証応答値)
- Page 133(0x85):4バイトの PWD
- Page 134(0x86):PACK(2バイト)
これらは PWD_AUTH コマンドに使用されます。
認証フロー(概要)
- Reader → Tag:PWD_AUTH コマンド(PWD を送信)
- Tag → Reader:PACK(2バイト)を返却
- PACK が一致すれば認証成功 → 認証セッション中のみ保護領域へアクセス可能
保護の注意点
- 認証は暗号的に強くない(平文送信)
- 認証後のアクセスはタグを離すとリセットされる
- 強いセキュリティ用途には不向き(NXP も明記)
実際にサービスへ組み込む場合は、NTAG215 の保護機能だけに頼らず、サーバー側でのUID検証や署名検証など、別の認証方式と組み合わせることを推奨します。
8. 保護構成の実例
ここまで解説してきた設定領域を組み合わせて、実際に「保護されたタグ」を作ってみましょう。 本章では以下の要件を満たすタグを構成します。
🏁 構成目標
- ユーザー領域(Page 4〜129)の 読み取り・書き込みともにパスワード必須
- パスワード認証の 試行回数を7回に制限(超過でロックアウト)
- ユーザー領域全体を 書き換え不可(Lock)
8-1. 設定値の全体像
以下が今回設定する各ページの値です。
| Page | アドレス | 設定値(Hex) | 意味 |
|---|---|---|---|
| 02 | 0x02 | 0000FFFF |
Static Lock(Page 4〜15 をロック) |
| 130 | 0x82 | FF000FBD |
Dynamic Lock(Page 16〜129 をロック) |
| 131 | 0x83 | 04000004 |
AUTH0 = 0x04(Page 4 以降を認証必須に) |
| 132 | 0x84 | 87050000 |
ACCESS(PROT=1, AUTHLIM=7) |
| 133 | 0x85 | 12345678 |
PWD(4バイトパスワード) |
| 134 | 0x86 | ABCD0000 |
PACK(認証応答値) |
8-2. 各設定値の詳細解説
Static Lock(Page 2):0000FFFF
Static Lock Bytes は Byte2-3 に配置されています。
FF=11111111b→ Page 4〜11 をロック(bit0〜7)FF=11111111b→ Page 12〜15 をロック(bit0〜3)+ OTP/CC保護
Dynamic Lock(Page 130):FF000FBD
Dynamic Lock Byte0 = FF の内訳
| bit | 値 | ロック対象 |
|---|---|---|
| 0 | 1 | Page 16〜31 🔒 |
| 1 | 1 | Page 32〜47 🔒 |
| 2 | 1 | Page 48〜63 🔒 |
| 3 | 1 | Page 64〜79 🔒 |
| 4 | 1 | Page 80〜95 🔒 |
| 5 | 1 | Page 96〜111 🔒 |
| 6 | 1 | Page 112〜127 🔒 |
| 7 | 1 | Page 128〜129 🔒 |
これにより、ユーザー領域全体が書き換え不可となります。
AUTH0(Page 131):04000004
Byte0 = 04 により、Page 4 以降すべてが認証必須領域となります。
つまり、ユーザーデータの先頭から認証が必要になる最も厳格な設定です。
ACCESS(Page 132):87050000
Byte0 = 87 = 10000111b を分解すると
| フィールド | bit位置 | 値 | 意味 |
|---|---|---|---|
| AUTHLIM | bit2-0 | 111b (7) |
認証失敗7回でロックアウト |
| NFC_CNT_PWD_PROT | bit4 | 0b |
NFCカウンタはパスワード不要 |
| NFC_CNT_EN | bit5 | 0b |
NFCカウンタ無効 |
| CFGLCK | bit6 | 0b |
設定ページ(83-84)はロックしない |
| PROT | bit7 | 1b |
読み取り・書き込み両方を保護 |
重要ポイント
PROT = 1により、パスワードなしではデータの読み取りすらできないAUTHLIM = 7により、7回失敗すると永久にアクセス不能CFGLCK = 0のため、AUTH0 / ACCESS は後から変更可能(NFC Tools での設定に必要)
PWD / PACK(Page 133 / 0x85、Page 134 / 0x86)
- PWD =
12345678:4バイトのパスワード(任意の値) - PACK =
ABCD:2バイトの認証応答値(認証成功時にタグが返す値)
8-3. 設定後のメモリ保護状態
設定完了後のメモリマップを視覚化します。

9. NFC Tools での設定手順
上記の保護構成を実際のタグに設定する手順を説明します。
NFC タグの設定には複数のアプリがありますが、今回は広く利用されている NFC Tools アプリを使用します。このアプリは Android / iOS 双方で提供されており、NFC タグの読み書きに対応しているほか、上級者向け NFC コマンド機能を使ってタグの詳細な設定が可能です。
⚠️ 設定前の重要注意事項
- Lock 設定は不可逆です。一度設定すると元に戻せません
- パスワードを忘れるとデータにアクセスできなくなります
- 必ずテスト用のタグで実施しましょう
手順
Step 1. ユーザーデータの書き込み
ロックする前に、保存したいデータを書き込みます。
- 「書く」>「レコードを追加」から任意のデータを書き込む
- または「その他」>「上級者向けNFCコマンド」で直接書き込み
- Data:
A2:04:01:23:45:67
- Data:
コマンド形式は A2:ページ:データ(4バイト、コロン区切り) です。
A2= WRITE コマンド04= 書き込み先ページ(Page 4)01:23:45:67= 書き込むデータ(4バイト)
Step 2. PACK(認証応答値)の設定
- 「その他」>「上級者向けNFCコマンド」
- Data:
A2:86:AB:CD:00:00
Step 3. PWD(パスワード)の設定
- 「その他」>「上級者向けNFCコマンド」
- Data:
A2:85:12:34:56:78
Step 4. Static Lock の設定
- 「その他」>「上級者向けNFCコマンド」
- Data:
A2:02:00:00:FF:FF
Step 5. Dynamic Lock の設定
- 「その他」>「上級者向けNFCコマンド」
- Data:
A2:82:FF:00:0F:BD
Step 6. ACCESS の設定
- 「その他」>「上級者向けNFCコマンド」
- Data:
A2:84:87:05:00:00
Step 7. AUTH0 の設定(認証が適用となるため最後に実行)
- 「その他」>「上級者向けNFCコマンド」
- Data:
A2:83:04:00:00:04
📝 設定順序が重要な理由
AUTH0 を設定すると、それ以降は指定ページ以降へのアクセスにパスワード認証が必要になります。そのため、AUTH0 は最後に設定してください。
なお、AUTH0 / ACCESS の設定自体を変更不能にしたい場合は、84 ページに C7:05:00:00(CFGLCK=1)を書き込む必要があります。ただし、AUTH0 にページ指定した後に CFGLCK を変更するには、パスワード認証と同一セッションで書き込みコマンドを実行する必要があります。
NFC Tools アプリではこの操作は実現できませんが、Android では NfcAdapter, NfcA を使用し、パスワード認証 -> 書き込みの実現が可能です。
iOSのパスワード認証は、レコチョク Advent Calendar 2025 1日目の【iOS/Core NFC】MIFAREコマンドを駆使して、パスワードで保護されたNFCタグからデータを読み出すが参考になります。
10. 設定の確認
設定が完了したら、実際にタグをスキャンして保護が有効になっているか確認しましょう。
10-1. NXP TagInfo での確認
設定した保護が正しく機能しているか確認するため、NXP社が提供する公式の NXP TagInfo アプリを使用します。
このアプリでは、タグのメモリ内容の詳細やセキュリティ設定の状態を確認できます。
設定が完了したタグをスキャンしてみましょう。
認証なしでは詳細データにアクセスできず、Page 4 以降が XXでマスクされていることが確認できます。
パスワード保護が有効なため、認証を通過しない限りユーザーデータの中身を見ることはできません。
これにより、タグの複製や内容の盗み見を防止できます。

10-2. AUTHLIM によるロックアウトの確認
AUTHLIM を設定したタグでは、パスワード認証に連続して失敗すると永久ロックが発生します。
確認手順
- NFC Tools の「その他」>「上級者向けNFCコマンド」を選択
- PWD_AUTH コマンドを実行:
1B:12:34:56:79(誤ったパスワード) - これを8回繰り返す
- 9回目以降、正しいパスワードの
1B:12:34:56:78を実行 <- 認証が失敗となる

⚠️ 注意:一度ロックアウトすると、正しいパスワードでも復旧不可能です。
この状態になったタグは事実上使用不能となります。
テストする場合は、失っても問題ないタグで試してください。
11. まとめ
本記事では、NTAG215 を保護された状態で運用するために必要な設定領域を整理しました。
扱った項目
| 項目 | 役割 |
|---|---|
| CC | タグの基本情報(読み取り専用フラグなど) |
| Static Lock | Page 4〜15 の不可逆ロック |
| Dynamic Lock | Page 16〜129 の広域ロック |
| AUTH0 | 認証が必要になる開始ページ |
| ACCESS | PROT(保護範囲)/ AUTHLIM(試行制限)/ CFGLCK(設定ロック) |
| PWD / PACK | パスワードと認証応答値 |
本記事で構成した保護タグの特徴
- データの読み取り・書き込みにパスワード必須
- 認証失敗7回で永久ロックアウト
- 全ユーザー領域を書き換え不可
⚠️ 最後に改めて注意
Lock と認証設定は誤設定すると復旧不能です。
特に CFGLCK = 1 と AUTHLIM ≠ 0 の組み合わせは、設定ミスやパスワード忘れで取り返しがつかなくなります。
(自分は検証の中でタグを10個以上は無駄にしました。。🪦)
NTAG215 のパスワード認証は暗号学的に強固ではありませんが、カジュアルな複製防止や改ざん検知には十分有効です。 この記事が、NTAG215 を使った保護されたタグ構成を検討する際の参考になれば幸いです。
参考資料
明日の レコチョク Advent Calendar 2025 は20日目 @ryo_segawa_natto さんの「Notionでタスクの一元管理をしてみた」です。お楽しみに!
齋藤匠