少し前から、同じ主張を何度も目にするようになりました。高級ブランドが製品にNFCチップを仕込んでいて、バッグやスニーカーにスマホをかざせば、それが偽物ではなく本物だとわかる、というものです。どの記事も同じ耳ざわりのいい一文を並べるだけで、どうやってなのかを語るものは一つもありませんでした。偽造業者がハンドバッグごとチップをコピーするのを、実際に何が食い止めているのでしょうか。
そこで私は、タグが気になったときにいつもやることをしました。AliExpressに行き、「NTAG 424 DNA」タグの出品を見つけ、少しだけ注文して、封筒が届くのを待ったのです。数ユーロと数週間で、あのブランド保護システムの土台になっているのと同じシリコンが、私の机の上に並びました。そして一枚をかざして、何をするのか確かめてみました。
NTAG 424 DNAタグの正体
見た目はごく普通のNFCタグです。安物の山の中から選び出すことはできませんし、どんなスマホも文句なく読み取ります。私のNFCタグの種類のガイドを読んでいれば、これはiPhoneが難なく読み取るType 4タグの一つとして、すんなり収まります。
違うのは「DNA」の部分です。チップの内部には、いくつかのAES-128鍵と小さな暗号エンジンが入っていて、普通のNTAG215やマルチパックのステッカーにはできないことができます。一回一回のタップに署名することです。その署名こそが、すべてです。「これがリンクです」と言うだけのタグと、「これがリンクです。そして、まさにこの本物のチップである私が、いま、それを提供しているという暗号的な証明もここにあります」と言うタグとの、違いなのです。
高級ブランドが実際にお金を払っているのは、まさにそこです。リンクそのものではなく、本物のチップがそれを提供しているという証明に対して、です。
SUNとSDMの仕組み:タップのたびに自分自身を書き換えるリンク
腑に落ちた瞬間のことをお話しします。タグが実際に何を送っているのかを見たとき、私はそれを理解するための仕組みの大半を、すでに自分で作っていたことに気づいたのです。
今年のはじめ、私はNFCタップカウンター機能をリリースしました。自分が何回読み取られたかを数え、その数字をURLに入れるタグです。おかげでリンク先は、これが47回目のスキャンだと知ることができます。NTAG 424 DNAタグはそれと同じ発想に、偽造を不可能にする暗号化の層を巻きつけたものです。
この仕組みはSUN(Secure Unique NFC)と呼ばれます。NXPのデータシートを読んでいるならSDM(Secure Dynamic Messaging)です。タグにはhttps://example.comのような普通のリンクを保存します。ただし、タップされるたびにそのリンクの一部をその場で書き換えるよう、チップに指示しておくのです。だから、あなたのスマホが実際に受け取るのは、こちらに近いものになります。
https://example.com/?picc_data=A1B2...&cmac=9F3C...
この2つの値は飾りではありません。picc_dataは、タグの本当のIDとタップカウンターを、チップの外には決して出ない鍵で暗号化したものです。cmacは、そのデータに対する暗号署名です。どちらもタップのたびに変わります。同じタグを2回かざせば、まったく異なる2つのURLが得られ、そのどちらもチップによって、その都度新しく署名されています。
私は普通のNFCタグを、店のショーウィンドウに貼られた印刷された看板のようなものだと考えています。誰でもそれを写真に撮り、まったく同じコピーを印刷できます。SUNタグはむしろ、あなたが入ってくるたびに、一枚ごとに番号が振られ判子が押された新しい受領書を手渡してくれる警備員のようなものです。昨日の受領書をコピーしても意味がありません。今日の番号は違いますし、本物なのは警備員の判子だけだからです。
クローンされたNTAG 424 DNAタグが見破られる理由
ここが、私の最初の疑問に答えてくれる部分です。偽造業者は、タグの中身なら間違いなくクローンできます。URLを読み取り、1バイトずつコピーし、空のチップに書き込めます。これは昔からずっと本当のことです。
彼らにできないのは、次の有効な署名を作り出すことです。署名鍵は本物のチップの内部にとどまり続け、タップの最中でさえ、決して外に出てきません。つまり、タップが何らかの意味を持つのは、実際にその鍵を握っている相手に対してだけなのです。本物のブランド保護の仕組みでは、タグのリンクは製造者が運用するサーバーを指していて、そのサーバーが各タップを復号し、署名を計算し直して鍵が一致することを確かめ、上がっていくカウンターを追い続けます。
クローンを捕まえるのは、その最後の部分です。偽造業者が偽物に載せられる唯一のURLは、本物のタップから捕らえたもの、つまりそのタップがたまたま運んでいたカウンターの値のまま凍りついたものです。それを再生すると、サーバーはすでに見たことのある数字を見ることになります。そして本物のチップのカウンターは前へ進む一方なので、同じ値や後戻りした値は、その再生を暴いてしまいます。新しくて、より大きなカウンターを、なおかつ検証を通る署名とともに送るには、鍵が必要です。そして鍵を手に入れるには、AESを破るか、チップを物理的に開けて中身を取り出すしかありません。偽物のハンドバッグのために、そのどちらかが起きることはありません。
これが、あのマーケティング文句の正直な言い換えです。チップは製品のコピーを不可能にするわけではありません。真正性の証明のコピーを不可能にし、その証明を、偽造業者には再現できないものの上へと移すのです。
チップの中身
NFC.coolがこれらのタグに対して行うことはどれも、チップの構造が頭に入っていればずっと理解しやすくなります。そこでまず、私がコードを一行書く前に作らざるを得なかった地図をお見せします。
NTAG 424 DNAは、416バイトのメモリを持つNFC Forum Type 4タグで、一つのアプリケーションの中に固定された3つのファイルを収める構成になっています。MIFARE DESFireのようにファイルを作ったり消したりすることはできません。使えるのは、この3つだけです。
| ファイル | サイズ | 中身 |
|---|---|---|
| File 01 | 32バイト | NDEFデータがどこにあるかをスマホに教えるケイパビリティコンテナ |
| File 02 | 256バイト | NDEFメッセージ、つまり通常はあなたのリンク。SUNは読み取りのたびに、その時々の値をこのファイルに映し込みます |
| File 03 | 128バイト | チップが暗号化したまま保持できる独自ファイル。NFC.coolはこれをVaultとして使います。詳しくは後述 |
ファイルの隣には、Key 0からKey 4までの番号が振られた5つのAES-128鍵が並んでいます。Key 0はアプリケーションのマスターキーです。リンクを変える、SUNをオンにする、他の鍵を変える、チップの構成に触れる、といった操作の認証に使うのがこの鍵です。Key 1からKey 4は、それ自体では何もしません。ファイルのアクセス権やSUNの設定がそれらを指すようになって、はじめて意味を持ちます。新品のタグでは5つの鍵はすべて16バイトのゼロで、NDEFファイルは誰でも書き込めます。買ったばかりのタグに普通のリンクが何の手続きもなく書き込めるのは、そのためです。
何かを変更するコマンドはすべて、認証済みのセッションの中で実行されます。スマホとチップがそれらの鍵の一つで相互にチャレンジレスポンスを行い、そこからセッション鍵を導き出し、以降のすべてのコマンドはMACを伴うか、丸ごと暗号化されます。これが、この記事でこのあと何度も出てくるセキュアメッセージングです。NFC.coolはiPhoneでもAndroidでもこれを完全に実装していて、以下で説明する書き込みはすべてこの仕組みを通ります。
かざすと何が見えるのか
タグをスマホにかざすと、iPhoneまたはAndroidのNFC.cool Toolsは、あなたに何も尋ねることなく、チップの奥まで読み取ります。具体的には、チップの識別情報と、それがTagTamper版かどうか、リンク、すべてのファイルの設定とアクセス権、どの鍵スロットが工場出荷時から変更されているか、そして3つの独立したチェックの結果です。
本物のNXPのシリコンか
すべてのNTAG 424 DNAは、オリジナリティ署名を持って工場を出ます。チップ自身の7バイトのUIDに対し、NXPの秘密鍵を使ってP-224曲線上で作られたECDSA署名です。NFC.coolはこれを読み取り、NXPが公表している公開鍵に照らして、スマホ上でそのまま検証します。あなたからの鍵は要りません。問題がなければ、アプリは「正規のNXP」と表示します。これで最初の問いに答えが出ます。本物のNXPのシリコンなのか、それとも同じ名前を名乗るだけのそっくりチップなのか、という問いです。
このタップは本物か
これがSUNのチェックです。アプリは、タグがたったいま返してきたリンクからpicc_dataとcmacを取り出し、PICCデータを復号してUIDと読み取りカウンターを得て、CMACを計算し直し、タグが送ってきたものと比べます。2つが一致すれば「本物」と表示され、カウンターの値は読み取りカウンターとして示されます。
このチェックにはタグの鍵が必要です。それがこのチェックの核心だからです。工場出荷時の鍵のままのタグは、すべてゼロの鍵で検証されます。自分の鍵でロックしたタグは、設定時にNFC.coolが保存した鍵で検証されます。他の誰かが、あなたの持っていない鍵でロックしたタグは「未検証」と表示されます。それが正しい答えです。
封印は破られていないか
このチップの一種であるNTAG 424 DNA TagTamperは、開封の痕跡が残る封印になるよう作られています。細い導電性のループが通ったステッカーで、守りたいものをまたぐように貼ります。箱のフラップの上や、ボトルのキャップのまわり、といった具合に。いまの「破ると保証無効」ステッカーと同じ役目です。中身を開ければステッカーが破れ、ループが切れます。
チップはこのループについて、2つのことを追跡しています。一度でも開けられたことがあるかを記録する永続的なラッチと、いま現在の状態です。NFC.coolはタップのたびに両方を読み取り、「未開封」「開封済み」、そしていちばん重要な「開封済み、再封済み」のいずれかを報告します。最後のものは、誰かがループを切り、そのあと丁寧に閉じ直したという意味です。ラッチは一方向なので、貼り直された箱はチップの一生のあいだ開封済みとして読み取られます。暗号はチップが本物であることを証明し、こちらは誰も箱の中に手を入れていないことを証明します。
自分のタグを書き込む:最短の手順
読み取りは半分にすぎません。もう半分は、AliExpressで買ったあの空のタグをあなた自身が書き込めるということで、最小限の設定なら3つのステップで済みます。
リンクを書き込む。どのタグでも同じ、普通のNDEF書き込みです。
SUNを有効にする。アプリはプレースホルダーを含めたリンクを書き込み、読み取りのたびに暗号化したUID、タップカウンター、署名をそのプレースホルダーに映し込むようチップに指示します。以降、タップのたびに固有の署名付きURLが生まれます。
自分のKey 0を設定する。工場出荷時のゼロを、あなただけが知る鍵に置き換えます。これで、他の誰もタグを再設定できなくなります。
最後のステップで入力するのは鍵ではなく、パスフレーズです。NFC.coolはそのパスフレーズのSHA-256ハッシュの先頭16バイトを取って、AES鍵を導き出します。iPhoneでもAndroidでも同じ方法なので、片方で設定したタグは、もう片方でも同じパスフレーズで開けます。自分のサーバーなど、別の場所で生成した鍵を使いたければ、代わりに32文字の16進数を貼り付けることもできます。
鍵を失えば、そのタグは二度と再設定できません。だからアプリは、鍵の保存先に気を配っています。iPhoneではキーチェーンに保存され、iCloud Keychainを通じて同期されます。Androidではハードウェア支援の鍵で暗号化され、Block Storeにも複製されるので、再インストールしても機種を変えても失われません。新しい鍵は変更が送信される前に保存され、変更の途中でタップが中断された場合は、タグがどちらを保持しているか確認できるまで、古い値と新しい値の両方が残ります。別の端末で設定したパスフレーズも入力でき、アプリは保存する前にそれをタグに照らして確かめます。
アプリがあえて拒むことが一つあります。通常の書き込み画面から、SUNが有効なタグに普通のリンクを書き込むことです。値を映し込む位置(ミラーのオフセット)は設定時のURLに合わせて固定されているので、長さの違うURLを書けば、チップはタップのたびに新しい内容の真ん中に値を映し込んでしまいます。NTAG 424の画面なら、まずSUNをオフにしてから書き込みます。
チップの残りすべて
たいていのチュートリアルは、あの最短の手順で止まります。そしてこれまで、その先へ進む方法といえば、デスクトップにUSBリーダーをつないでNXPのTagXplorerを使うことでした。私はデータシートの全部にスマホから手が届くようにしたかったので、上から順に一節ずつたどっていきました。
5つの鍵すべて
Key 0には専用の画面があり、Key 1からKey 4は「詳細設定」の下にあります。どの鍵もパスフレーズか16進数から設定でき、工場出荷時のデフォルトにリセットでき、別の端末で設定済みなら、その値を入力することもできます。変更はすべてKey 0で認証されます。5つのスロットすべての変更権限を握っているのが、Key 0だからです。
鍵を選べるSUN
SUNを有効にするのは、スイッチを一つ入れるだけの話ではありません。まずモードを選びます。暗号化モードでは、UIDはpicc_dataの中に入って運ばれ、鍵を持つ人だけが読めます。平文モードでは、UIDとカウンターがURLにそのまま現れ、秘密なのは署名だけです。そして、どの鍵に仕事をさせるかを選びます。PICCデータを暗号化するメタ読み取り鍵と、署名を計算するファイル読み取り鍵です。同じスロットでも、別々のスロットでも構いません。ブランドがパートナーに、UIDを復号する鍵は渡さないまま、タップを検証する鍵だけを渡せるのは、この仕組みのおかげです。
工場出荷時のゼロのままのスロットを選ぶと、アプリが警告します。誰もが知っている鍵で作った署名は、何も守ってくれないからです。検証の側も、この組み合わせの自由度をそのまま受け止めます。Key 3で署名され、Key 1で暗号化されたタップも、その鍵がスマホに保存されていれば正しく検証されます。
ファイルのアクセス権
すべてのファイルには4つの権限があります。読み取り、書き込み、読み取りと書き込み、そして変更です。最後の変更は、他の3つを誰が編集できるかを決めます。それぞれの権限は、5つの鍵のいずれか、「自由」(誰でも)、または「不可」(誰も、永久に)を指します。つまり「File 02は誰でも読めるが、書き込めるのはKey 2だけ、そしてこのルールを変えられるのはKey 0だけ」と決めておけば、チップはアプリの介在なしにそれを守らせます。
NFC.coolは各ファイルの現在の権限を表示し、編集できるようにします。警告も2つ組み込んであります。権限がこのスマホの持っていない鍵を指しているときは、そう教えてくれます。自分自身を締め出すことになるかもしれないからです。そして「変更」を「不可」にする前には、別のステップで確認を求めます。一度書き込めば、そのファイルのルールはチップの一生のあいだ凍結されるからです。
チップの構成
ファイルの下には、チップ自身の構成があります。NXPはこれをSetConfigurationという一つのコマンドにまとめていて、NFC.coolは次の項目に対応しています。
ランダムUID。通常、チップはどのリーダーに対しても同じ固定のUIDを返すので、誰でもタップをまたいでタグを追跡できます。ランダムUIDをオンにすると、チップは毎回新しいランダムなIDを返し、本当のUIDは認証したあとにしか明かしません。プライバシー面での確かな利点ですが、これも永続的です。アプリはタグをUIDで識別するので、その後は知っているKey 0を一つずつ試して、認証付きのGetCardUIDで本当のUIDを取り戻します。だからタグは、設定したスマホから引き続き管理できます。
認証失敗の上限。Key 0をロックするまでに、チップが誤った鍵の試行を何回まで許すかです。鍵の推測に対する防御ですが、低くしすぎると、数回のタップの失敗でマスターキーが永久にロックされかねません。
バックモジュレーション強度。強または標準。標準は小さなアンテナでは読み取れないことがあるので、デフォルトのままにしておくのが無難です。
チェーン書き込み。無効にでき、その場合は一回の書き込みが1フレームに制限されます。永続的です。
ケイパビリティバイト。NXPがユーザーの自由な用途のために残してある2バイトです。
LRP。セキュアメッセージングのスイッチで、後ほど独立した節で説明します。
Vault:タグの中の小さな金庫
File 03は、チップが暗号化したまま保持できる128バイトの独自ファイルです。NFC.coolはこれを、タグそのものに載った小さなプライベートな保管庫「Vault」に変えます。初めて何かを保存するとき、アプリはこのファイルを完全暗号化モードに切り替え、すべてのアクセス権をKey 0にロックします。それ以降、Vaultには最大126バイトのテキストが入り、それを読み戻せるのはあなたの鍵だけです。他のスマホから詳しく読み取ろうとしても、返ってくるのは権限エラーだけです。
これは、誰かのデータベースに置くのではなく、物そのものと一緒に移動すべき秘密のためのものです。シリアル番号、未来の自分へのメモ、自分のサーバーが待ち受けるトークン。Key 0を工場出荷時にリセットするとVaultは消去されます。Vaultがなくなる方法は、それだけです。
LRPモード
ふだんチップは、ありふれたAESで鍵を守っていて、鍵を盗むにはAESそのものを破らなければなりません。ところが、もっとずるい攻め方があります。チップを作業台に載せ、暗号処理を走らせている間の、電力消費のかすかなふらつきや電磁的な放射を測るのです。そうしたトレースが十分に集まれば、数式には一切手を触れずに、その漏れだけから鍵を再構成できてしまいます。LRP(Leakage-Resilient Primitive)は、その漏れに手がかりを一切与えないよう設計し直されたセキュアチャネルです。NXPはAN12304でこれを文書化していますが、ワインボトルに貼るステッカーには本当にやりすぎで、だからこそほとんどのタグはこれをオンにせず、ほとんどのツールはこれを話せるようにもなりません。
最初のバージョンの設計メモには、「LRPモード」のすぐ隣に「対応予定なし」と書いていました。それでも頭から離れなかったので、作りました。NFC.coolはタグをLRPモードに切り替えられます。そしてより重要なのは、切り替えたあとも認証して管理し続けられることです。鍵、ファイルの権限、Vault、チップの構成、そのすべてがAESではなくLRPのチャネルを通ります。
そのスイッチを入れる前に、知っておくべきことが2つあります。まず、これは永続的です。一度LRPモードに入ったタグは、AESのセキュアメッセージングが永久に無効になり、AESしか話せないツールは二度とそのタグと話せません。そして、LRPのタグではSUNは使えません。タップに署名するのが仕事のタグは、AESモードのままにしておくべきです。
取り消せない操作
これらのコマンドの多くは永続的で、アプリはその瞬間にはっきりと声を上げます。取り消せない操作はどれも、正確な結果を明記した警告を通じて確認を求めます。とはいえ、ここにも一覧にしておく価値があります。
LRPの有効化。
ランダムUIDの有効化。
チェーン書き込みの無効化。
ファイルの「変更」権限を「不可」に設定すること。
鍵の紛失。チップに工場出荷時リセットはありません。Key 0を失えば、タグを再設定する手段も一緒に失われます。
認証失敗の上限を低くしすぎること。数回の誤ったタップでKey 0がロックされかねません。
大事なタグに触れる前に、予備で練習してください。
偽造防止NFCタグが実際に使われる場所
正直なところ?NFCタグをかざすほとんどの人は、こんなものは何一つ必要としませんし、それでいいのです。リンクを開くステッカーは、すばらしくて、退屈で、役に立つものです。
けれども、これを一枚でも手にしてしまえば、使い道は明らかです。高級バッグは、自分が本物だと証明できます。ワインやウイスキーのボトルは、こっそり栓を抜かれて中身を継ぎ足されたことが一度もないと示せます。その半分は開封防止の封印が担います。薬の箱は、中身が本物の薬であることと、誰も封を破っていないことの両方を保証します。イベントのチケットは、スクリーンショットを撮って回し配りできるものではなくなり、ドアのそばのタグは、誰かがソファから保存したリンクを再生したのではなく、実際にそこに立ったことを証明します。これは、EUデジタル製品パスポートが規制の側から回り込んでいるのと同じ真正性の問題を、一つひとつの物のレベルで解いたものです。
私がこれを作ったのは、千人のユーザーが求めたからではありません。好奇心からインターネットで変わったタグを買い、その仕組みを解き明かし、そうしてデータシートの一ページも残さずめくらずにはいられなくなったから作ったのです。たいてい、良い機能はそうやって生まれます。
NTAG 424 DNAタグの結論
NTAG 424 DNAタグは、NFCが持つものの中で、改ざん不可能な封印にいちばん近いものです。誰かが製品をコピーするのを止めることはできませんが、製品の本物であることの証明を偽造不可能にします。その証明が、本物のチップだけが作り出せる、その都度新しい暗号署名だからです。
NFC.cool Toolsはそれらを読み取り、チップ、タップ、そして開封防止の封印を検証し、チップのすべてをあなたの手で設定できるようにしてくれます。すべての鍵、すべてのファイルの権限、チップ自身の設定、LRPまで、そのすべてをスマホから。タップがどうやって本物と偽物を見分けられるのか気になったことがあるなら、iPhoneかAndroidで手に入れ、こういったタグを数ユーロで何枚か注文して、自分でかざしてみてください。なかなか良い沼ですよ。