web-dev-qa-db-ja.com

NFCタグへの読み取り/書き込み、パスワード保護付き)

NFC=タグにテキストデータを書き込む/読み取る必要があります。読み取り/書き込みが機能することを期待している方法は次のとおりです。

  1. 初めての書き込みでは、パスワードを設定できるはずです。
  2. 次回、誰かがOR書き込みを試みたときに、パスワードを持っている場合は、読み取り/書き込みを実行できるはずです。
  3. 他のアプリケーションは、ステップ1で設定したパスワードなしではタグを変更できません。

暗号化されたデータを一度タグに書き込むことを念頭に置いて、もう1つの方法を考えました。書き込みが完了すると、タグは読み取り専用になります。私はこれを行うことができます。しかし今、タグを読み取り専用にすることはそれほど効率的ではないことに気づきました。

インターネットでたくさん検索しましたが、信頼できる記事やガイドはまだ見つかりませんでした。だから誰かがNFCタグのパスワード保護をしたなら、私を導いてください。

10
pcj

NFCタグ(または実際には、5つのNFCフォーラムタグ操作仕様の1つを実装するNFCフォーラムタグ)は、セキュリティメカニズムなしの単純なデータメモリ(メモリを読み取り専用にロックする以外)。これらのタグは、自由に読み取り可能なデータをNDEF形式で格納することを目的としています。タグの内容の読み取り(またはタグの内容を他のタグにコピーすること)に対する認証または保護メカニズムは標準化されていません。

ただし、一部の既存のタグ製品は、NFCフォーラムで指定されているものを超える追加のセキュリティ機能を実装しています。

最も単純なメカニズムは、短い「パスワード」(通常は32ビット値)です。認証の場合、このパスワードはクリアテキストでタグに送信され、タグは認証を確認/拒否します。 (NFCを介したクリアテキストでの送信は、通信を盗聴した誰でもパスワードを取得できることを意味します。)このタイプのパスワード保護をサポートする一部のタグは、認証を使用して、定義されたメモリ領域をアクセスなしに切り替えることができます。読み取り専用アクセス、および読み取り/書き込みアクセス。

  • このタイプのパスワード検証を実装する製品は、たとえば、Infineon SLE66R01P、NXP MIFARE Ultralight EV1、NXP NTAG21xなどです。

より洗練されたアプローチは、共有キーを使用した相互チャレンジ/レスポンス認証です。単純なクリアテキストのパスワードと比較すると、これは、受動的な盗聴者が共有キーを発見できないことを意味します。パスワードと同様に、認証状態は、ほとんどの既存のタグ製品で、定義されたメモリ領域をアクセスなし、読み取り専用アクセス、読み取り/書き込みアクセスの間で切り替えるために使用できます。ただし、それらすべてが暗号化によってメモリアクセスと認証パスをバインドするわけではありません。

  • 3パス相互認証を実装する製品は、たとえば、NXP MIFARE Classic *、NXP MIFARE Ultralight C、NXP MIFARE DESFire(EV1)、Sony FeliCaカードです。

    *)MIFAREクラシックの独自の認証および暗号化プロトコルは、2008年以降壊れていることがわかっていることに注意してください。さらに、MIFAREクラシックは、NXPのAndroidチップセットを備えたNFCデバイスでのみサポートされます。

Androidで認証を実装する場合、次の点に注意する必要があります。

  1. それでもNDEFメッセージ(インテントフィルターで宣言するカスタムレコードまたはAndroidアプリケーションレコード)を介してアプリを自動起動するメリットを享受したい場合は、自由に読み取り可能なメモリが必要です。そのNDEFメッセージを含みます。パスワード保護/認証はNFCフォーラムの仕様の一部ではないため、Android自体はタグを認証できません(Androidは正しいキー/パスワードを持っていません)。したがって、NDEFメモリ領域(フラットな線形アドレス可能なメモリを備えたタグの場合、これは通常、タグメモリの最初のNブロックです)は認証なしで読み取り可能である必要があります。

  2. アプリケーションマニフェストでNFCインテントフィルターを使用せず、フォアグラウンドディスパッチシステム(またはリーダーモードAPI)のみを使用する場合でも、NDEFを使用して検出/フィルターすることができますyourタグ。

  3. NDEF抽象化レイヤー(つまり、Ndef/NdefFormatableクラス)を使用して、保護されたメモリ領域にアクセスすることはできません。代わりに、タグ技術クラス(NfcA、...、IsoDep)のいずれかを使用して、タグプラットフォーム固有の低レベルコマンドを交換する必要があります。また、複数のタグクラスを混在させないでください(たとえば、認証コマンドを送信するためにNfcAを使用し、後でデータを読み取るためにNdefを使用します)。これは一部のデバイスでは機能しますが、これらの通信オブジェクト間を移動するとタグとの通信をリセットするため、ほとんどのデバイスでは機能しません。

  4. 一部のAndroidデバイス(主にAndroid 5より前)のタグ存在チェックメカニズムには、認証に干渉する可能性のある既知の問題があります(つまり、存在チェックは認証コマンド間でコマンドを送信する場合があります)その結果、認証が失敗します)。この問題は、リーダーモードAPIで克服できます。

  5. 最後に、パスワード/認証キーをアプリ内に保存すると、攻撃者がアプリを簡単にリバースエンジニアリングしてキーを取得できることに注意してください。

13
Michael Roland

MIFARE DESFire などの一部のタグは、あなたが説明するようにパスワード/暗号化をネイティブでサポートしています。 NFCタグにはデータのコピーに対する保護が組み込まれていないため(設計上)、より一般的なタイプのタグ(Topaz/MIFARE Ultralightなど)でこの機能を再作成することは本質的に不可能です。暗号化する前にデータを暗号化することもできますが、そのためには、データをデコードするツールが暗号化方式を使用できるようにする必要があります(たとえば、スタンドアロンアプリであり、Android OSとは別のものなど)。安価なタグは、あなたが言うように、永久的に読み取り専用にすることができます。

つまり、mostNFCタグは、達成しようとしていることをサポートしませんが、次のようなタグが存在します(かなり高価です)。大量のデータとパスワードベースの暗号化などのツールをサポートします。

MIFARE DESFIREはISO 14443-4に準拠しているため、Androidを使用している場合は、IsoDepメソッドを使用できます。パスワードの読み取り/書き込み方法などの詳細については、この関連記事を参照してください: Android NFC APIはMifare Desfireをどの程度サポートしていますか?

3
henrycjc

私は現在NFCベースのプリペイド充電メータープロジェクトに取り組んでいます。これまでにあなたが尋ねた質問に直接思います。パスワード保護機能は非常に多くのNFC Mifareクラシックファミリー、Ultralightファミリー、NTag21xファミリーなどのタグ。

あなたの質問に対する答え:

  1. パスワードを設定するには?
    それぞれのデータシートのデータシートを参照して、メモリの構成を調べます。その後、パスワードを書き込むページまたはアドレスを見つけます。 mifareクラシックカードの場合、セクタートレーラーブロックがパスワードキーブロックです。したがって、そのブロックにパスワードを書き込むだけです。パスワードを書き込む適切なロジックを維持しないと、カードがブロックする可能性があります。
  2. 書き込んだパスワードが何であれ、読み取ることはできません。したがって、そのキーを知っている人は、そのタグへのアクセスのみが許可されます。
  3. NFCアクセス条件を使用して、タグメモリ全体を読み取りおよび書き込みとして構成できます。

データシートを参照するだけで済みます。

0
Sai Kumar