技術記事
MACコマンドの構造
ID TECHの多くのお客様が関心を寄せているのが、 ポイントツーポイント暗号化(P2PE)です。PCIの厳格なP2PEルールへの準拠を目指す中で、お客様は次の製品もよく検討されます。 SRED(Secure Reading and Exchange of Data)対応の決済デバイスです。こうしたデバイスは、データを取得時点で暗号化する(ID TECHのすべての製品が備える機能)だけでなく、改ざん検知機能、改ざん発生時のデータ自動消去機能、その他の特殊なセキュリティ機能も搭載しています。
こうした「その他の特殊なセキュリティ機能」の中でも特に重要なのが、コマンドのMAC認証として知られる仕組みです。
暗号技術において、メッセージ認証コード(MAC)とは、メッセージの受信者がそのメッセージを認証する、つまり信頼できる送信者から送られたものであることを確認するために用いられる短いコードです。MAC値は、送信者と受信者の双方が知る秘密情報とメッセージを組み合わせることで、メッセージのデータ完全性と真正性の両方を保護します。メッセージそのものは平文で送信されますが、それに加えて「メッセージ+MAC」(秘密情報を暗号化して含む)も送信されます。同じ秘密情報を持つ者であれば、そのメッセージ(および付加されたMAC)が、同じ秘密情報にアクセスできる別の誰かから送られてきたものかどうかを判定できます。
ID TECHのSREDベースのカードリーダーでは、特定の機密性の高いコマンドがMACで保護されています。つまり、コマンドに付随するMACハッシュが(デバイス内に保存された鍵で)検証できない限り、デバイスはそのコマンドを実行しません。コマンドの送信者は、デバイスが検証に用いるのと同じ鍵を使ってMACハッシュを生成する必要があります。
具体例を示すと分かりやすいかもしれません。
たとえば、SREDデバイスであるID TECHのAugusta Sカードリーダーで日時を設定したいとします。「日時設定」コマンドは機密性が高いとみなされます。なぜなら、不正な第三者が取引の日付を遡らせたり(あるいは改変したり)できてはならないからです。(その他の「機密性の高い」コマンドには、たとえばホワイトリストへのカードの追加・削除、デバイスの証明書失効リストの変更などがあります。)
通常、非SREDのAugustaで日時を設定する場合は、ファームウェアコマンド 78 53 01 50 を使用し、続いてペイロード長(0x08)、日時長(0x06)、6バイトの日時(YY MM DD HH MM SS の形式)、最後に「MAC長」(非SREDデバイスではゼロ)を指定します。Augusta Sでも基本的な構成は同じですが、ペイロード長は0x26、「MAC長」は0x1Eとなります。これは、末尾に30バイトの「MACペイロード」が追加されるためです。
もちろん、Augustaの場合、コマンド全体をID TECHのNGAプロトコル形式にフォーマットする必要があります。これは、コマンド構造の先頭にSTX(0x02)と2バイトのリトルエンディアン長を付け、末尾にLRC、チェックサム、ETX(0x03)を付ければよいだけです。最終的なMAC版のコマンド全体は次のようになります(コマンドバイトを黄色で示しています)。
02 2B 00 78 53 01 50 26 06 17 11 10 09 15 00 1E 10 00 4E C7 DF CF 04 D3 3C C6 EC 6F 50 92 00 86 A1 DD 0A 00 62 99 49 00 00 00 00 00 00 02 EB F9 03
セクションごとに分解して見ていきましょう。
02 はSTXです。
2B 00 は構造全体の長さ(リトルエンディアン)で、LRC/チェックサム/ETXのトレーラ部分を除いたものです。
78 53 01 50 は日時設定のファームウェアコマンドです。
26 (16進数)は、続くペイロードが38バイトであることを示します。
06 は日時が6バイトで構成されることを示し、その内訳は次のとおりです。
17 11 10 09 15 00 — 2017年11月10日 午前9時15分00秒。
1E は、続くMACペイロードが30バイトであることを示します。
10 00 はリトルエンディアンで16を示す長さ値です(ID TECHのMACハッシュはすべて16バイト長のため)。
4E C7 DF CF 04 D3 3C C6 EC 6F 50 92 00 86 A1 DD は16バイトのMACハッシュ、すなわち「HMAC」です。
0A 00 は、続くKSNの長さを示すリトルエンディアンの値10です。
62 99 49 00 00 00 00 00 00 02 はMAC KSNです。
EB はLRC(縦方向冗長検査)値です。
F9 は、78 から最後のKSNバイト(02)までのすべてのバイトに対する8ビットチェックサムです。
03 はETX(送信終了)です。
このコマンドの構築自体に特に難しい点はありません。自明でない部分はKSNと、HMAC(ハッシュ本体)です。
MAC KSN
MAC KSN(Key Serial Number)は、必要な時点でデバイスに問い合わせて取得しなければなりません。次の規格をご存じであれば話は早いでしょう。 ANSI X9.24-1(取引ごとに固有の鍵を導出する規格、DUKPT)ご存じのとおり、KSNは10バイトの値で、下位21ビットが使用ごとにインクリメントされるカウンターを構成しています。あまり知られていないかもしれませんが、デバイスが複数のDUKPT鍵(たとえばデータ用、MAC用、PIN用)を持つ場合、それぞれに専用のKSNがあり、互いに同期せずにインクリメントされます。ただし、KSNは公開値であり、ID TECHのAugustaでは、(完全に整形された)コマンド 02090078463e040005010000000603 を使えば、いつでもMAC KSNを照会できます。
KSNが重要なのは、MAC鍵の算出に用いられるからであり、この鍵は使用ごとに一意となるため(リプレイ攻撃を受けません)。KSNおよびDUKPT鍵導出に関する詳細は、以下をご覧ください。 このテーマに関する以前の2部構成の投稿.
HMACの導出
ここからが少しマニアックな部分です。
HMAC(参照: RFC 2104)は、業界で受け入れられているMACハッシュの作成方式であり、以下を用います:
- — 128ビットのワンタイム鍵
- — 任意のメッセージペイロード
- — SHA-256ハッシュ
当該の鍵は、標準のDUKPTルールに従い、MAC KSNとデバイスのIPEK(さらにこれはBDKから導出される)を用いて動的に導出されます。ルールでは、(データ鍵やPIN鍵とは異なる)MAC鍵を導出する特定の方法が規定されています。詳細はすべて以下に記載されています。 以前の2部構成の投稿
恐ろしげなHMACハッシュは、次の超怖そうな見た目のレシピに従って計算されます:
H( (K' ⊕ opad) ‖ H( (K' ⊕ ipad) ‖ m) )
これに怯む必要はありません。実は十分に理解可能です。値 K は128ビットの鍵です。 K' (K-プライム)は、同じ鍵を全長64バイトになるようゼロパディングしたものを意味します。
本製品は ipad (内側パッド)は、定数 36363636… を64バイトの長さまで繰り返したものに過ぎません。
K' ⊕ ipad は、ゼロパディングされた鍵とipad値を、排他的論理和(XOR)—コンピューターサイエンス愛好者に好まれるビット単位の算術演算—で組み合わせることを意味します。
K' ⊕ ipad) ‖ m は、上記で得られた値の末尾にメッセージ(m)を追加することを意味します。バイトを末尾に付け加えるだけです。(長さは64バイトを超えますが、気にしないでください。)
H( (K' ⊕ ipad) ‖ m) は、括弧内の値全体に対してハッシュ関数(この場合はSHA-256)を適用することを意味します。
そのステップが完了したら、結果を次の値に付加します: K' ⊕ opadここでopad(外側パッド)は、5C5C5C5C… を64バイトの長さまで繰り返した定数です。そして、全体をもう一度ハッシュします。
気になっている方のために補足すると、ipadとopadの値は(このアルゴリズムの原著者によって)任意に選ばれていますが、ハッシュの前半と後半の間でハミング距離(ビット単位の差分)が最大となるよう選ばれています。ハッシュは入れ子状に半分ずつ行われ、さまざまな形式のなりすましを防いでいます。
HMAC値の作成を支援するため、ID TECHはHTMLフォームをオンラインで公開しています。 こちらこのフォームでは、KSNとBDK(ルート鍵)の値を入力し、MAC鍵を導出して、HMACを用いて32バイトのMACハッシュ(SHA-256経由)を作成できます。ぜひ以下を試してみてください: 「Generate HMAC (with verbose output)」 フォーム上部のドロップダウンメニューから選択してください。HMACパズルの各ピースがどのような形をしているかを、明確に説明する非常に便利な詳細出力トレースが得られます。
当社のオンラインツールで、KSN を 62 99 49 00 00 00 00 00 00 02、ルート鍵(BDK)を ANSI標準テスト鍵である 0123456789ABCDEFFEDCBA9876543210 として MAC鍵を生成すると、MAC鍵の値は 3E4A480ACE8B239B9539E6053EAB03D9 となるはずです。この鍵を用いて、ペイロード 78 53 01 50 26 06 17 11 10 09 15 00 1E 10 00 にHMACアルゴリズムを適用すると、32バイトのHMACハッシュが得られ、その先頭16バイトは 4EC7DFCF04D33CC6EC6F50920086A1DD になるはずです。(ID TECHは先頭16バイトのみを使用します。)これが、Set Date and Time コマンドに付加される魔法の「指紋」です。カードリーダーは、平文のペイロードバイトを参照し、自身のKSNと内部の鍵導出コードを使って、コマンドに含まれていたものと同じHMAC値を算出します。これにより、当該コマンドが魔法のBDK(0123456789ABCDEFFEDCBA9876543210)を知っているソース、すなわち信頼できるソースから発信されたものであることが検証されます。
DUKPT、HMAC、SRED、P2PEに関するご質問はありませんか?当社の専門家にお問い合わせください。喜んでお手伝いいたします:
