日本語版
最新ニュース
科学&テクノロジー

LinuxでNFCパスポートチップを読む – TerenceEdenのブログ

退屈でまったく不気味な理由のために、Linuxを使用してパスポートのNFCチップに含まれるすべてのデータを読みたいと思います。長くて迷惑な検索の後、私は落ち着きました RoeftenのPypassport。 これで、生体認証を含むすべてのパスポート情報を読むことができます。 背景 MRZの再現 MRZを生成するPythonコード キャンセルされたパスポートを読むことができますか? 暗号化およびその他のセキュリティ パスポートをブルートフォースできますか? パスワードをブルートフォーチングする価値はありますか? インストール 構造化されたデータを取得します 画像を保存します うまくいかなかった mrtdreader Jean-Francois HouzardとOlivier RogerのPypassport ビュージャンのピパスポート D-Logic Androidリーダー それだけの価値はありますか? パスポート内のNFCチップは、パスワードによって保護されています。パスワードは、物理パスポートの内側に印刷されています。 NFCが動作するためにパスポートに物理的に近くにいる必要があるだけでなくまた、パスワードを表示できる必要があります。パスワードは「Machine Readable Zone」(MRZ)に印刷されています。そのため、一部のボーダーガードがチップをスキャンする前にパスポートを読者にスワイプします。パスワードが必要であり、入力したくありません。 でも小さな問題がありました。私は私の古いパスポートを使用しています どれの キャンセルされました。キャンセルは、ドキュメントを取り消すことだけではありません。また、物理的に変更されています: 個人詳細ページの左下隅を切り取り、写真の反対側の角にMRZをカットしてください。 したがって、MRZの塊が欠けています!なんてこった!何ができるか!? MRZの再現 パスワードは3つのデータで構成されています。 パスポート番号(文字と番号) 生年月日(yymmdd) 有効期限(yymmdd) 各ピース また…

LinuxでNFCパスポートチップを読む –  TerenceEdenのブログ

1750842418
2025-06-25 07:33:00

退屈でまったく不気味な理由のために、Linuxを使用してパスポートのNFCチップに含まれるすべてのデータを読みたいと思います。長くて迷惑な検索の後、私は落ち着きました RoeftenのPypassport

これで、生体認証を含むすべてのパスポート情報を読むことができます。

パスポート内のNFCチップは、パスワードによって保護されています。パスワードは、物理パスポートの内側に印刷されています。 NFCが動作するためにパスポートに物理的に近くにいる必要があるだけでなくまた、パスワードを表示できる必要があります。パスワードは「Machine Readable Zone」(MRZ)に印刷されています。そのため、一部のボーダーガードがチップをスキャンする前にパスポートを読者にスワイプします。パスワードが必要であり、入力したくありません。

でも小さな問題がありました。私は私の古いパスポートを使用しています どれの キャンセルされました。キャンセルは、ドキュメントを取り消すことだけではありません。また、物理的に変更されています:

個人詳細ページの左下隅を切り取り、写真の反対側の角にMRZをカットしてください。

したがって、MRZの塊が欠けています!なんてこった!何ができるか!?

MRZの再現

パスワードは3つのデータで構成されています。

  1. パスポート番号(文字と番号)
  2. 生年月日(yymmdd)
  3. 有効期限(yymmdd)

各ピース また チェックサムがあります。この計算は、付録Aに定義されています ドキュメント9303のパート3

ああ、文字列全体にチェックサムがあります。パスポートカバーが切り取られたときに切り取られるのは、この最後のチェックサムです。

最終的なパスワードは次のとおりです。 Number Number-checksum DOB DOB-checksum Expiry Expiry-checkum checksum-of-previous-digits

MRZを生成するPythonコード

パスポート番号、生年月日、有効期限がわかっている場合は、独自のマシン読み取り可能なゾーンを生成できます。これは、NFCチップのパスワードとして機能します。

 Python 3def calculateChecksum( value ):
    weighting = [7,3,1]
    characterWeight = {
        '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7,  
        '8': 8, '9': 9, ': 0, 'A':10, 'B':11, 'C':12, 'D':13, 'E':14, 
        'F':15, 'G':16, 'H':17, 'I':18, 'J':19, 'K':20, 'L':21, 'M':22, 
        'N':23, 'O':24, 'P':25, 'Q':26, 'R':27, 'S':28, 'T':29, 'U':30, 
        'V':31, 'W':32, 'X':33, 'Y':34, 'Z':35
    }
    counter = 0
    result = 0
    for x in value:
        result += characterWeight[str(x)] * weighting[counter%3]
        counter += 1
    return str(result%10)

def calculateMRZ( passportNumber, DOB, expiry ):
    """
    DOB and expiry are formatted as YYMMDD
    """
    passportCheck = calculateChecksum( passportNumber )
    DOBCheck      = calculateChecksum( DOB )
    expiryCheck   = calculateChecksum( expiry )
    mrzNumber  = passportNumber + passportCheck + DOB + DOBCheck + expiry + expiryCheck
    mrzCheck = calculateChecksum( mrzNumber ).zfill(2)
    mrz =  passportNumber + passportCheck + "XXX" + DOB + DOBCheck + "X" + expiry + expiryCheck + " + mrzCheck
    return mrz

print( calculateMRZ("123456789", "841213", "220229") )

パスポートのカバーをカットすると、その中のアンテナが破壊されると思っていたでしょう。しかし、に戻ります 英国のガイダンス

エパスポートのバックカバーをカットしてはいけません

ああ!それがNFCチップのある場所です。これは、キャンセルされたパスポートを真正性のために検証できるようにしていると思います。

ありがたいことに、セキュリティはすべてかなり標準的な公開キーの暗号化です – 9303パート11 それを説明します 耐え難い 詳細レベル。

私が好奇心を抱いていることの1つは、チップにタイマーがないため、読み取り頻度がわからないためです。何千ものパスワードの試行で攻撃することができ、ロックアウトされません。確かに、仕様には次のように書かれています。

攻撃者の成功確率は、攻撃者がICにアクセスするまでに与えられ、パスワードを推測するための単一の試みの期間、およびパスポートのエントロピーが与えられます。

Willllll … MayBeeeee …?

パスポートは一般に10年間しか有効です。そのため、36,525の有効期限です。

パスポートホルダーは一般に100年未満です。そのため、生年月日は3,652,500です。

それはすでに133,407,562,500の試みです – そして、私たちは1E24の可能なパスポート番号にさえ進んでいません!

私の実験では、誤ったが有効なMRZの結果を送信して、非常に短い時間で「セキュリティステータス(0x6982)ではないセキュリティステータス(0x6982)」を返します。通常、1秒未満。

しかし、その誤った試みを送信すると、次の応答の遅延が導入されたように見えました – 数秒で。正しいMRZを送信すると、これをリセットして、チップを即座に読み取らせました。

したがって、ターゲットのパスポート番号と誕生日を知っていれば、有効期限を強制するブルートには数日かかります。瞬時ではありませんが、不可能ではありません。

ほとんど 商用NFCチップは100,000の執筆をサポートしています 読み取り数に制限がありません。また、24ビットの読み取りカウンターがあり、読み取りの試行ごとに増分します。 1600万人の読み取り後、カウンターは増加しません。それ できた 特定の数の読み取り後にチップが自己破壊する可能性がありますが、パスポートチップがそれを行うという証拠はありません。

それですか
価値
ブルートフォーチングパスワード?

あなたがMRZをブルートフォースする場合、パスポートホルダーの生年月日を発見します。あなたも得るでしょう:

  • 彼らの写真のデジタルコピー、
  • 彼らのフルネーム、
  • 彼らのセックス

  • 彼らのパスポートを発行した国、そして
  • 彼らの国籍。

それはすべて、パスポートを見ることから見ることができるものです。そのため、電子的に読み込もうとすることにはほとんど価値がありません。

前述のように、私は使用しています https://github.com/roeften/pypassport

私がインストールする必要がある唯一のライブラリはでした pyasn1 使用 pip3 install pyasn1 – セットアップは異なる場合があります。

Pypassportをダウンロードしてください。同じディレクトリで、テストPythonファイルを作成して、パスポートを読み取ることができるかどうかを確認できます。これに封じ込める必要があるものは次のとおりです。

 Python 3from pypassport import epassport, reader

#   Replace this MRZ with the one from your passport
MRZ = "1234567897XXX8412139X2202299

def trace(name, msg):
    if name == "EPassport":
        print(name + ": " + msg)

r = reader.ReaderManager().waitForCard()

ep = epassport.EPassport(r, MRZ)
ep.register(trace)
ep.readPassport()

NFCリーダーをプラグインし、パスポートを置き、上記のコードを実行します。それが機能する場合、パスポートで見つけることができるすべてのデータを含む、多くのデバッグ情報が吐き出されます。

パスポートデータの構造は少し複雑です。 仕様 データを異なる「データグループ」に入れます – それぞれ独自のIDを使用します。

実行することによって:

 Python 3ep.keys()

利用可能なデータグループを確認できます。私の場合、 ['60', '61', '75', '77']

  • 60

    いくつかのメタデータを含む共通エリアです。そこに面白いことは何もありません。

  • 61

    DG1 -MRZフルです。これには、所有者の名前、性別、国籍などが含まれています。

  • 77

    ドキュメントセキュリティオブジェクトです – これは私にとって空でした。

  • 75

    DG2からDG4バイオメトリックテンプレートです。これには、画像とその他のメタデータが含まれています。

生体認証の投棄 – print( ep["75"] ) – これらの興味深いメタデータを与えます:

'83': '20190311201345',
'meta': {   'Expression': 'Unspecified',
            'EyeColour' : 'Unspecified',
            'FaceImageBlockLength': 19286,
            'FaceImageType': 'Basic',
            'FeatureMask': '000000',
            'FeaturePoint': {0: {'FeaturePointCode': 'C1',
                                'FeatureType': '01',
                                'HorizontalPosition': 249,
                                'Reserved': '0000',
                                'VerticalPosition': 216},
                            1: {'FeaturePointCode': 'C2',
                                'FeatureType': '01',
                                'HorizontalPosition': 141,
                                'Reserved': '0000',
                                'VerticalPosition': 214}},
            'Features': {},
            'Gender': 'Unspecified',
            'HairColour': 'Unspecified',
            'ImageColourSpace': 'RGB24',
            'ImageDataType': 'JPEG',
            'ImageDeviceType': 0,
            'ImageHeight': 481,
            'ImageQuality': 'Unspecified',
            'ImageSourceType': 'Static Scan',
            'ImageWidth': 385,
            'LengthOfRecord': 19300,
            'NumberOfFacialImages': 1,
            'NumberOfFeaturePoint': 2,
            'PoseAngle': '0600B5',
            'PoseAngleUncertainty': '000000',
            'VersionNumber': b'010'
        }

私が理解しているなら テスト文書 – 「機能ポイント」は目の中央です。性別(セックスではない!)と髪の色も記録できることを見るのは興味深い。 「andgle」はを表します ピッチ、ヨー、ロール 顔の。

画像を保存します

パスポートの画像は、JPEGまたはwithで保存されます JPEG2000エンコーディング。非常に限られたメモリを考えると、利用可能な写真は小さく、非常に圧縮されています。鉱山はわずか19kbでした。

画像を保存するには、バイトをつかんでディスクに貼り付けます。

 Python 3photo = ep["75"]["A1"]["5F2E"]
with open( "photo.jpg", "wb" ) as f:
   f.write( photo )

予想どおり、「機能ポイント」の座標は、私の目の中心にほぼ対応していました。ニフティ!

いくつかの異なるツールを試しました。あなたが私と同じ間違いを犯さないようにここにリストされています!

mrtdreader

由緒ある mrtdreader。私のNFCデバイスがビープ音を鳴らし、MrtdReaderは「NFCデバイスは見つかりません」と言いました。

私はこれがなぜならだと思います NFCツールは年齢で更新されていません

Jean-Francois HouzardとOlivier RogerのPypassport

私は見ました Pypassport ただし、Python 2でのみ利用できます。

ビュージャンのピパスポート

これ Pypassport パスポートが特定のセキュリティの脆弱性に耐性があるかどうかのみをチェックします。

D-Logic

Digital LogicのEpassportソフトウェア ハードウェアリーダーとのみ動作します。

Androidリーダー

タナナエフのパスポートリーダー -Androidで完全に機能します。パスポートチップが読みやすいことは知っていましたが、アプリはLinuxで実行されません。

ええ、私はそう思います!現実的には、誰かのパスポートを読むためにMRZを割ることはできません。しかし、個人情報を収集する必要がある場合、パスポートから迅速に行うことは完全に可能です。

MRZはaです 読み取り可能なマシン ゾーン – テキストをOCRしてから、それをNFCリーダーに渡すのはかなり簡単です。

また、MRZがなくなったとしても、パスポートに印刷されたデータから再構築できます。

もちろん、これは不正なパスポートを検出することはできません。データベースが取り消されたかどうかを確認することはありません。暗号化の異常を検出するとは思わない。

しかし、旅行文書に何があるかを見たいだけなら、それは完全に機能します。

#LinuxでNFCパスポートチップを読む #TerenceEdenのブログ

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。