すべての記事

Luhnアルゴリズム:カード番号の正しさをどう検証するか

カード番号の最後の1桁は適当に決められたものではなく、長い番号を手入力する際に起こりやすい入力ミスを検出するために設計されたチェックデジットである。

Luhnアルゴリズムの仕組み

このアルゴリズムは番号の各桁を右から左へたどり、1桁おきに値を2倍にし、結果が9を超えた場合は9を引く。番号が正しく入力されていれば、こうして得られたすべての桁の合計は10で割り切れる。

VisaでもMastercardでもなく、1950年代のIBMの発明

このアルゴリズムはIBMの科学者ハンス・ピーター・ルーン(Hans Peter Luhn)にちなんで名付けられており、彼は1954年にこれを、あらゆる数字列の転記ミスを検出する汎用的な手法として特許を取得した — 元々クレジットカードとは無関係だった。決済ネットワークが後にこれを採用したのは、計算コストが低く、手入力で最も起こりやすい2種類のミス(1桁の誤入力、隣接する2桁の入れ替え)を確実に検出できるためだ。

JCB:日本発の国際カードブランド

VisaやMastercardと並んで、日本には1961年に設立されたJCB(Japan Credit Bureau)という独自の国際カードブランドがある。JCBカードも同じLuhnアルゴリズムによるチェックデジットの対象だが — このアルゴリズム自体は特定のブランドに限定されない — BINの範囲はVisaやMastercardとは異なり、JCBは主に3528〜3589の範囲を使用する。

Luhnチェックに合格してもカードが実在するとは限らない理由

Luhnチェックが確認するのは番号の数学的な構造だけであり、その背後に実在する口座があるかどうかは分からない。このチェックに合格する番号は理論上いくらでも生成できるが、そのほとんどは実在のカードと結びついていない — 実際の決済では、最終的にカード発行銀行による確認が必ず必要になる。

何に使えるか

  • フォームをサーバーに送信する前に、入力ミスのあるカード番号をクライアント側で検出する。
  • 長い番号を手入力した際の明らかなタイプミスを素早く見つける。
  • Luhnチェックが実際に何を証明し、何を証明しないのかを理解する。

番号から決済ネットワークを判別する(BIN)

カード番号の最初の数桁はBIN(Bank Identification Number)と呼ばれ、Luhnチェックを行う前の段階で決済ネットワークを判別できる。Visaは4から、Mastercardは51〜55の範囲または新しい2221〜2720の範囲から、American Expressは34または37から、JCBは3528〜3589の範囲から始まる。この先頭の数桁を見て、決済フォームは番号の入力途中でも該当するブランドのアイコンを表示できる。

ツールを試す