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では、中間一致攻撃とかが有名。要調査)