FeliCaのIDmは認証に使ってはいけない

会員証や支援者証をFeliCa/FeliCa Lite-Sで作って、イベント等で活用できないか検討したときの調査メモです。

IDmは製造者コードとカード識別番号から成る8バイトのコードで、FeliCaカードを識別する製造IDです。ポーリングへの応答メッセージに含まれます。

このFeliCaのIDmは非常に簡単に利用できるため、出退勤管理などに用いられています。

しかし、セキュリティ面を考慮すると、IDmを認証の用途に使うことはおすすめできません。

理由1. IDmは一意性が保証されていない

ソニーが公開している公式ドキュメントによると、以下の記載があります。

カード識別番号の体系によっては、カード識別番号がカードごとにユニークな値とならない場合がある点に
注意してください。

ソニーイメージングプロダクツ&ソリューションズ株式会社「FeliCa 技術方式の各種コードについて」
https://www.sony.co.jp/Products/felica/business/tech-support/st_code.html

つまり、一意性が保証されていないため、もしかすると複数のカードが同じIDm番号をもつ可能性があるということです。

現実には社内でFeliCaカードのIDmが被るということはなかなかないとは思いますが……

理由2. IDmの偽装だけなら簡単にできる

カードがポーリングに対してIDmを応答する通信は暗号化されていないため、原理上、簡単に偽装することができます。

特殊な機材がなくとも、普通に市販されている部品だけで、比較的簡単に実現できるようです。

http://www.atelier-nodoka.net/2012/05/arduino-rcs620s-tginittarget/

解決法 FeliCa Liteでは片側認証の仕組みを用いる

FeliCa Lite, Lite-Sには片側認証とよばれる認証方法が用意されています。

これは、3DESを用いたチャレンジレスポンス認証的なもののようです。

予めカードの書込専用領域に書き込んだカード鍵(暗号鍵)と、都度書き込んだ乱数をもとにMACを算出する機能があります。

手元にある暗号鍵と乱数を用いて算出したMACと、カードが算出したMACが一致することを確認できれば、カードが偽造されたものではないことを確認できます。

https://www.slideshare.net/mobile/hiro99ma/felica-lite

http://www.marketeq.co.jp/felica_2.html

http://wiki.onakasuita.org/pukiwiki/?FeliCa%20Lite-S

格納できる鍵長は最大16バイト(128ビット)で、パリティを考慮すると112ビット、3DESで1番目の鍵と3番目の鍵に同じ鍵を使用しているので、もしかしたら実質的な強度は112ビット未満かも?(3DESでは、中間一致攻撃とかが有名。要調査)