さまざまな種類のファイルからクレジット カード番号 (CCN) を検出できるアルゴリズムを作成したいと考えています。
CCN を見つける簡単なシナリオは、正規表現を定義どおりに使用することです。
- Visa:
^4[0-9]{12}(?:[0-9]{3})?$
すべての Visa カード番号は . で始まり4
ます。新しいカードは 16 桁です。古いカードは 13 です。 - MasterCard:
^5[1-5][0-9]{14}$
すべての MasterCard 番号は から までの数字で始まり51
ます55
。全部で16桁です。 - American Express: American Express カードの番号は、またはで
^3[47][0-9]{13}$
始まり、15 桁です。34
37
- ダイナース クラブ:ダイナース クラブのカード番号は、 ~、または
^3(?:0[0-5]|[68][0-9])[0-9]{11}$
で始まります。全部で14桁です。で始まる16 桁のダイナース クラブ カードがあります。これらは Diners Club と MasterCard の共同事業であり、MasterCard のように処理する必要があります。300
305
36
38
5
- Discover: Discover カードの番号はまたは
^6(?:011|5[0-9]{2})[0-9]{12}$
で始まります。全部で16桁です。6011
65
- JCB:
^(?:2131|1800|35\d{3})\d{11}$
で始まる JCB カードは 15 桁です2131
。1800
で始まるJCBカード35
は16桁です。
次に、見つかった数を Luhn Mod-10 アルゴリズムで確認し、条件を満たしていれば、CCN を見つけたと言えます。
しかし、この単純な方法には、私の経験から非常に多くの誤検出/誤検出があります。
偽陽性/陰性の一致を減らすために、どのアルゴリズムまたはヒューリスティックを使用できますか? PCI Data Finder や Card Recon などの高度なソフトウェアは、より信頼性の高い結果を提供していますが、その結果は単純な正規表現の検索や Luhn チェックでは得られません。