クレジットカード番号はIDですか？ICですか？磁気ですか？

[ミクシィグループ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/mixi) の24日目の投稿です。

こんにちは, taoka-chanです。
SNSの会社にはいったら、いつの間にかにID/決済基盤をつくっていて、クレジットカードを発行\([6gram](https://6gr.am))しています、不思議なものであります。

基本ネットワークゲーム以外のインターネットに生息していませんので、久々に物書きをします、お手柔らかに。（キワキワになったので図などを後で追加しよう^q^)

## はじめに
カレンダーには PKCS #11/15 周りについて書くと書きましたが、嘘です。
代わりに訳のわからないタイトルをつけました、ちょっとずつタイトルの意味を読み解いていきましょう。

今回はクレカの周辺の概念みたいな話をするので、PKCS(Public Key Cryptography Standards)についてはお話ししませんが、みなさんなんだかんだ使っているものですね。
公開鍵や証明書といったあたりの標準化の話です。
\#11/#15 はよくあるセキュリティデバイス(入館ICカードとか)で使えるAPI定義だったり、フォーマットに関して決められていたりします。ただしこの辺りは企業秘密的なものが多くて、 #15 で標準化とありますが、なんだかんだHardwareに依存することになるので気をつけましょう。

## クレジットカード番号はIDですか？

最初から謎ワードです、結論を先に言うとIDです。
クレジットカードは皆さんご存知ですよね、お買い物によく使います。

クレジットカード≠クレジットカード番号

はい、意味わかります。クレジットカード番号は`Primary Account Number (PAN)`と呼ばれて、PCIDSS(クレカ系のセキュリティ基準)でめちゃくちゃ厳重に取り扱えって話になっています。
クレジットカード番号を漏洩させられたら、皆さん怒ります、わかります。でもそれはなぜなのでしょうか？

クレジットカード番号は一般的に16桁ですが、頭の6桁は会社なんかの識別子です。すると残りは10桁、電話番号くらいの長さになりました。電話番号も漏らすと怒られますね。電話番号もIDでしょう。

カード番号の下4桁はレシートとかに印刷されていたりなんだかんだ見えても問題なさそうに感じますね。まぁなので6-10桁くらいの数字を何ぞれすればカード番号を当てることができることになります。ちょろそうですね。

## IDがバレるとどうなるのでしょう？
IDを自称することで身分を偽ることができます。

電話番号だけで何かを注文できたりするサービスは世の中にそこそこあったりますね。

ショッパイECサイトだと、クレジットカード番号だけで買い物ができることがありますね。コワイ
**IDを教えるだけで済む世界も世の中にはある**
と言うことです。

顔パスはちょっと毛色がちがいます、
私の実家のに近くにあったガソリンスタンドは、私が立ち寄って、taoka-chan家の息子ですって言えば、ガソリンを入れてくれました。でもこれは、車や顔立ちも見て判断しているでしょう。これは本人しか持っていない何かを認証に使っているのでただ知っているとかいってるだけよりも信憑性が高いでしょう。

こういった、やわな認証（認証自体をしていない時もあります）によって、なんかしら経済被害がおきた場合は、その情報を鵜呑みにして認証をした事が落ち度と一般的になります。お店が基本悪いはなしですね。信憑性のないものを信じてはいけません。

## IDを知っているだけでは使えない対策
だから、私たちが普段webで使う IDは、ログインID（電話番号やメールアドレス）だけを知っているだけでは利用できないように対策をしています。

みんな大好き`PASSWORD`認証や、私が作っている6gramやID基盤では、SMSやMailで認証コードを送って、正当なログインIDの所有者であることを確認したりしていますます。安心ですね。
他にも2段階認証も最近は追加で求めたりしますよね。FIDOなんかも便利で安心です。

### クレジットカード番号では？
パスワードのようなものとして、セキュリティーコードがありますが、
**3桁** 驚きの短さです、しかも数字のみです。
おそらくこんな短いパスワードを設定できるwebサービスは存在しないでしょう。

一応有効期限も必要ですがそれも4桁の数字ですし、過去の日付はありえず、期限もあって4、5年が限度なので、せいぜい50種類くらいしか数字はありません。

だから、2段階認証のようなものを用意していて、それが3-D Secure(3DS/本人認証サービス)です。
あの白い、全く関係のないドメインのサイトで、これまた違うドメインのカード会社webサイトのログインパスワードをいれさせられたりするあれです。

### クレジットカードでは？
冒頭で、クレジットカードとクレジットカード番号を分けました。

クレジットカードはECなどの取引では使えません、お店などで提示して使うものです。
クレジットカードには,VISAやJCB, Masterのロゴや箔押しなどの偽造対策処理がされています、なので日本銀行券のように、クレジットカード自体に効力があります。

また、 ICや磁気ストライプがついていてそれらを決済に使うのが普通です。
磁気カードでの取引では、磁気の中にはセキュリティコードのようなものが入っているので、それをつかって認証をしたり、サインや券面を人手でチェックして、クレジットカード番号の認証を行います。
ICではもうちょっと高度なことをしています。

## スキミングとコピー
偽札としてお札もコピーされますが、クレジットカードもコピーをされます（特に磁気）。

なぜ磁気が狙われるかと言うとかなり単純だからです、カセットデッキ（死語）みたいに簡単にダビングできます。取引時もデータを読んで送るだけです。なので毎回取引時にPasswordのようなものを送っている感じですね。WebのBasic認証のように感じますね。

カードの読み取り機のそばに磁気リーダを置いて、コピーのカードを作るとかそう言うのも流行りました。
毎回同じデータを送るのでなんとなく、パスワードと同じで定期変更と言いたくなる気もします。実際にはwebのように任意のタイミングで、自分が信じたタイミングで送信できるわけでもなく、勝手に読めるので、危ない物体です。パスワードを定期変更しろとは言いたくないですが、簡単に見えそう(秘密になってない）パスワードは変更した方が良いでしょう。

カード券面は正直バリエーションが多すぎるので、正規のカードかどうかなんて多分クレジットカードオタクでも難しいです、痛い系クレカもありますしね、難しすぎ。
なので、磁気カードはコピーができると見ていいので所持認証として見るのは無理があります。
そこで、ICカードの取引をすることにシフトしています。証明書チェーンなどで正規カードかとかも判別できたりしますね。

## IC取引とNFC
皆さんはICクレジットカードやNFC(PayWave/Contactless）などがついたクレジットカードを、
接触カードリーダやNFCリーダーで読んだことはあるでしょうか？
実際にやってみると、クレジットカード番号などが普通に読めます。
EMVCoの仕様をみれば、どのような場所にそのような情報が入っているかなどもすぐにわかるでしょう。

接触ICは結構外部から読むのが難しいですが、NFCで読めちゃうってもしかしてスキミングし放題などでは？と心配になってしまいます。すくなくともクレジットカード番号はかなり簡単にNFCリーダーで読めちゃいます。

### NFC決済は危険なのでしょうか？

IC/NFCの決済では、取引の金額や形態などをICに書き込んで、取引用のMAC(Message Authentication Code)を得られるようになっています。取引の状態やnonceを混ぜて、MACを生成する仕組みです。

MACを生成するときに使う鍵は、カードに予め入れてあり、全てのカードで別の鍵がセットされています。特別な方法以外で読むことはできません。したがって、MACを生成する事ができるカードを複製することは不可能です。

### でもMACを再利用できるのでは？
カードと決済機の通信を傍受してMACを盗みとったりすればよいのでは？ とか考えてしまいます。
MACの生成には、時間やATC(ApplicationTransactionCounter)という、何回めの取引かみたいなカウンターがpayloadとして含まれていたりします。したがって時間が経ったり、再利用したときにわかる仕組みになっていますね。JWT(JSONWebTOKEN)などと似てますね。

結局送っているものは見えちゃう前提で、再利用を不可にしたり、同じものを作れないようなものを作って送るのが間違いなさそうと言う話です。

同じようなもので車のキーレスがありますが、これらはリレーアタックでがっつり破られています、クレジットカードでやることは難易度が高いのですが、携帯電話のNFCなどは電界強度が強いのでそのうち注意が必要なのかもしれません。

## これからのクレジットカード
私が使っているお店の周りで、磁気ストライプをシュッとして決済は最近ほぼしません、みなさん安全なICカード取引で取引しましょう。Basic認証を使い続けるのはいやですよね。

最近いくつかのカード会社でカード番号が書いていないクレジットカードが出てきました、オンラインんで使わないならその方が安全そうですね。
そう考えると、普通のクレジットカードはカード番号とセキュリティコードがのっているので、ログインIDとパスワードを書いた紙を持って歩いているようでダサいのでした。

オンライン決済でもApplePayなどを使えばMacやiPADにも、クレジットカードをTokenとして入れ込む事ができます。
IC取引と同じで取引に応じて決済Tokenが払い出されるので安心です、GooglePayにも来ることを信じましょう。

## まとめ
- クレジットカード番号はIDだった
    - 認証に関しては webにでも同じことをしていた。
- IDは推測可能だったり公開しているものもあるけど、認証・認可が弱いところで使われて不幸になる人が出たりするからむやみやたらに漏らすのはやめようね
- IDだけを信じるのは絶対にやめよう、ちゃんと認証しようね
    - SNS連携して検証もせずにID取れたわーい(⌒▽⌒)とかしないでね
- 秘密情報をそのまま送らない話は結構あるよ、大事な鍵やパスワードが出ていかない方法も使ってみようね
    - ICクレジットカード取引もそうでしたが、公開鍵ベースの認証やFIDOとかいろいろ考えられてるよ

## 感想など
IDと決済は似ているよーとは聞いていましたが追っていくと、本当にまぁ守らないといけないラインは似てるし、サボるとダメだなーと思いました。

クレジットカード作ってたら色々JCBやVISAから鍵管理に関して、ルール準拠を求められたり単純に強いID基盤を安全に運用するための参考になるところもあります、
しかしなかなかWeb脳だと厳しいなーと思う部分は結構あるのでまだまだ頑張らないとなと思います。

明日は最終25日、 @Taillook さんが何かを書いてくれるみたいです。