Вопрос о том, можно ли «угадать» номер банковской карты, часто встречается в форумах по информационной безопасности. В этой статье мы разберём:
- структуру номеров карт разных платёжных систем;
- алгоритм Луна (Luhn), который проверяет корректность номера;
- сколько вариантов существует и какова вероятность случайного угадывания;
- какие существуют практические методы генерации «правильных» номеров;
- юридические и этические аспекты.
Структура номера банковской карты
Номера карт (PAN – Primary Account Number) состоят из 12‑19 цифр, но в большинстве стран используют 16‑значные номера. Их части:
- BIN / IIN (Bank Identification Number) – первые 6 цифр, определяют эмитент (Visa, MasterCard, МИР и т.д.).
- Номер счёта – от 7‑й до предпоследней цифры (обычно 9‑12 цифр), уникален внутри банка.
- Контрольная цифра – последняя цифра, вычисляется алгоритмом Луна.
Примеры префиксов:
| Платёжная система | Префикс (BIN) |
|---|---|
| Visa | 4 |
| MasterCard | 51‑55, 2221‑2720 |
| American Express | 34, 37 (15‑значные карты) |
| МИР | 2200‑2204 |
Алгоритм Луна (Mod 10)
Контрольная цифра генерируется по простому правилу:
- Начиная с предпоследней цифры, каждая вторая цифра удваивается.
- Если удвоенное значение больше 9, из него вычитается 9 (или складываются цифры результата).
- Все полученные цифры суммируются.
- Если сумма делится на 10 без остатка – номер считается валидным.
Ниже – пример реализации на Python, взятый из открытых источников:
from random import randint
def luhn_check(number: str) -> bool:
"""Проверка номера карты по алгоритму Луна."""
digits = [int(d) for d in number]
checksum = 0
# Проходим справа налево
for i in range(len(digits) ⎻ 2, -1, -1):
d = digits[i]
if (len(digits) ⎻ i) % 2 == 0: # каждая вторая цифра
d *= 2
if d > 9:
d -= 9
checksum += d
# Последняя цифра – контрольная
control = (10, (checksum % 10)) % 10
return control == digits[-1]
def generate_card(issuer_prefix: str) -> str:
"""Генерирует случайный, но корректный номер карты."""
# 15 цифр без контрольной (для 16‑значных карт)
body = ''.join(str(randint(0, 9)) for _ in range(15 — len(issuer_prefix)))
partial = issuer_prefix + body
# Вычисляем контрольную цифру
checksum = 0
for i, ch in enumerate(reversed(partial)):
d = int(ch)
if i % 2 == 0: # каждая вторая (с учётом обратного порядка)
d *= 2
if d > 9:
d -= 9
checksum += d
control = (10 ⎻ (checksum % 10)) % 10
return partial + str(control)
print(generate_card('4')) # → 4539 1488 0343 6467 (пример)
Сколько вариантов существует?
Для 16‑значных карт с фиксированным 6‑значным BIN остаётся 9 цифр (номер счёта) + 1 контрольная цифра.
- Возможных комбинаций номера счёта: 10⁹ = 1 000 000 000.
- Контрольная цифра определяется однозначно, поэтому реальное количество валидных номеров = 10⁹.
Вероятность случайно подобрать работающий номер без знания BIN:
[
P = rac{10^{9}}{10^{16}} = 10^{-7} pprox 0{,}00001%
]
То есть в среднем нужно попытаться около 10 млн раз, чтобы один из номеров оказался «живым». На практике такие попытки блокируются системой антифрода уже после нескольких десятков неверных вводов.
Как «угадать» номер карты в реальном мире?
Брутфорс по онлайн‑формам
Теоретически можно отправлять запросы с разными номерами, но:
- Большинство платёжных шлюзов ограничивают количество попыток (обычно <10‑20 в минуту).
- Каждая неуспешная попытка фиксируется в журнале и приводит к блокировке IP.
- Алгоритм Луна отсекает ~90 % случайных комбинаций ещё до обращения к процессору банка.
Социальная инженерия и утечки данных
Самый «эффективный» способ – получить часть номера из публичных источников (например, в рекламных акциях показывают первые 6 цифр) и дополнить его, используя:
- Списки утекших баз (через тор‑форумы, data‑breaches).
- Номера, оставшиеся в кэше браузера после незакрытой формы оплаты.
Генерация тестовых номеров
Для разработки программного обеспечения часто используют тестовые номера, которые проходят проверку Luhn, но не привязаны к реальному счёту. Примеры (из официальных документов Visa/MasterCard):
- Visa:
4111 1111 1111 1111 - MasterCard:
5555 5555 5555 4444 - American Express:
3782 822463 10005
Эти номера можно использовать только в тестовых средах (sandbox), иначе они могут привести к блокировке аккаунта.
Юридические и этические аспекты
Попытка подобрать или использовать чужой номер карты без согласия владельца считается преступлением в большинстве стран (ст. 159 УК РФ, 18 U;S.C. § 1029 и т.п.). Наказание может включать:
- штрафы до нескольких миллионов рублей/долларов;
- лишение свободы до 10 лет (в зависимости от суммы ущерба).
Разработчикам рекомендуется:
- Использовать только официальные sandbox‑окружения банков.
- Не хранить реальные номера карт в логах.
- Применять токенизацию и шифрование данных.
Как защититься от попыток угадывания
- Ограничение количества попыток ввода номера и CVV (rate‑limiting).
- 3‑D Secure – дополнительный слой аутентификации.
- Мониторинг аномальных паттернов (много запросов с разных IP, одинаковый BIN).
- Регулярная проверка списков утекших данных (HaveIBeenPwned, breach‑feeds).
Технически «угадать» номер карты можно только в рамках ограниченного пространства:
- Зная BIN и имея доступ к базе реальных номеров, вероятность становится приемлемой.
- Случайный брутфорс практически невозможен из‑за огромного пространства и защиты от фрода.
Самый надёжный способ защиты – использовать многоуровневую аутентификацию, ограничивать количество попыток и никогда не хранить полные номера карт в открытом виде.
Дата генерации статьи: . Информация взята из открытых источников (форумы Codeby.net, статьи на Хабре, официальные документы Visa/MasterCard) и дополнена аналитикой.