http://habrahabr.ru/post/229393/
Это не мое

Некоторое время назад на Хабре уже мелькали посты о работе банкоматов: один и два, но оба они описывали принципы работы банкоматов и вообще карточного процессинга весьма поверхностно.
Для интересующихся под катом много подробностей работы карточного процессинга банка (много букв).

Как выглядит упрощённая схема работы работы процессингового центра банка:

image

Процессинг

FrontEnd — отвечает за online сообщения: общение с банкоматами и POS-терминалами, передача авторизаций карт в VISA.
BackEnd — отвечает за offline: закрытие операционного дня, обмен финсообщениями с VISA.
HSM (Hardware Security Module) — модуль работы с ключами безопасности (подробнее описано ниже).

Все шифрование производится с помощью алгоритма 3DES.

Подключение к VISA

Банк имеет два типа подключения к VISA:
online
offline


Online-подключение

Транспортный уровень
Подключение к VISA осуществляется через вполне конкретного провайдера, в 2006 году это был Equant и его партнёр в России — Golden Telecom, как обстоят дела сейчас — я не в курсе.

Получается, что VISA доступна в локальной сети одного провайдера. Это обязательное требование VISA. Для подключения провайдер прокладывает в банк собственный оптоволоконный кабель для основного канала связи и для резервного. Устанавливает конечные маршрутизаторы и выделяет по одному порту на каждом (основной и резервный). Управление маршрутизаторами осуществляется только провайдером.

Итак, связь транспортного уровня с VISA установлена, далее прикладной уровень.

Прикладной уровень
Связь прикладного уровня осуществляется по специальному протоколу, разработанному в VISA в незапамятные времена.

Кроме всего этого все сообщения должны передаваться зашифрованными. Для этого специальные люди — офицеры безопасности — генерируют ключевые последовательности заданной длины на HSM и результаты отправляются в VISA.

Оффлайн-подключение

Оффлайн-подключение — это не что иное, как обмен файлами с информацией обо всех транзакциях, совершённых за операционный день. То есть, если в банкоматах банка «А» были обслужены карты не банка «А». Подробнее об этом чуть ниже в сценарии «Чужой клиент в нашем АТМ».

Стоит немного рассказать про HSM.

HSM

HSM — это классический чёрный ящик. При инициализации он генерирует закрытую и открытую компоненту мастер-ключа банка. Закрытую компоненту никто никогда не видит, она всегда остаётся в памяти HSM.

Сам модуль имеет многочисленные уровни защиты от взломов: программного и физического. При малейшем намёке на компрометацию ключа память модуля самоуничтожается без возможности восстановления.

Три части открытой компоненты мастер-ключа записываются на 3 магнитные карты и выдаются офицерам безопасности банка.

Итак, связь с VISA установлена, и всё работает. Теперь нам надо выпускать карты.
При вступлении в VISA банку выдаются так называемые БИНы (Bank Identification Number): то есть подмножества номеров карт доступных для выпуска. Для VISA они всегда начинаются на 4.

БИНы распределены по карточным продуктам, например:

VISA Classic: 400001
VISA Gold: 400002
VISA instant issue: 400003
и так далее


Формат номера выглядит так: допустим, у нас есть карта с номером: 4408 0412 3456 7890

Номер карты состоит из:

4ХХХХХ — код VISA
4408(04) — код банка (код карточного продукта)
12 3456 7890 — номер лимита авторизации. Подробнее о лимите авторизации ниже.


Для интересующихся вот здесь описано, как происходит валидация номера карты.

Для каждого БИНа генерируется пара ключей: IWK (issuer working key) и AWK (acquirer working key). Процедура генерации и передачи результата в VISA аналогична описанной выше.

После этого всё это добро прописывается в FrontEnd и BackEnd процессинга. В BackEnd для выпуска карт и их эмбоссирования, вo FrontEnd для обслуживания авторизаций.

Теперь у нас есть связь с VISA и есть выпущенные карты; другими словами, мы осуществили эмиссию карт. Нам осталось сделать эквайеринг.

Банкоматы

Не буду повторяться и описывать, что находится внутри банкомата, это уже описали здесь. Скажу только, что протокол NDC+ (NCR Direct Connect) разработан чёрт знает сколько лет назад корпорацией NCR — одним из ведущих производителей банкоматов на сегодняшний день.

Широко известны три производителя:

NCR
Wincor Nixdorf GmBH (бывший Siemens Nixdorf)
Diebold (бывший IBM)


Да, и Siemens и IBM когда-то давно производили банкоматы, но впоследствии продали этот бизнес Wincor Nixdorf и Diebold соответственно.
Ваш покорный слуга является сертифицированным инженером как раз таки Wincor Nixdorf. Однако, у нас был один стародавний IBM, который был выпущен ещё до продажи бизнеса и который работал.
Не скажу, что работал он как часы, ибо его всё время приходилось подкручивать и подлаживать, чтобы он хоть как-то дышал, но для него можно было купить запчасти. Правда, стоили они в три раза дороже чем аналогичные для Wincor Nixdorf.
Итак, мы выяснили что есть два протокола по которому работают банкоматы. Мне довелось работать лишь с NDC+, про DDC я только слышал, но никогда не видел.
Поскольку я близко знаком только с Wincor Nixdorf, предположим, что наш банк купил именно их.

Когда на банкомат поставлен софт, который управляет всеми его многочисленными устройствами — надо подготовить банкомат к работе.

Готовим банкомат

Обучение

Банкомат надо обучить выдавать купюры. Для этого есть специальная процедура: банкомат отсчитывает по 10 листов из каждой кассеты и предлагает оператору ввести реальное количество отсчитанных листов. Если реальное количество отличается — банкомат откорректирует оптопары в тракте выдачи и предложит повторить процедуру.

Из опыта у меня всего пару раз банкомат ошибался, то есть, как правило, они с завода уже неплохо откалиброваны.

Ключи шифрования

В банкомат загружают 2 ключа шифрования:
мастер-ключ (MASTER KEY) — используется для шифрования ПИН-блока введённого клиентом.
коммуникационный ключ (COMM KEY) — для шифрования пакета к FrontEnd процессинга.

На HSM генерируются открытая и закрытая компонента каждого ключа, после чего открытая компонента прописывается во FrontEnd, а закрытая загружается в банкомат.
Оба ключа загружаются в ПИН-клавиатуру (EPP Encrypted Pin Pad) и хранятся только там. По сути EPP — это такой маленький HSM, который не умеет генерировать ключи, но умеет очень хорошо их хранить. Когда я плотно работал с банкоматами — EPP имели 7 ступеней защиты от физического проникновения.

После этого прописываем адрес процессинга, настраиваем VPN или что там придумают бойцы телекоммуникаций, и можно загружать сценарий работы банкомата.

Сценарий

Про сценарий уже было сказано в статье, на которую я ссылался, хочу лишь немного добавить.
Весь сценарий банкомата основан на так называемых ФИТах (Financial Institution Table).
FIT — не что иное, как БИН банка выданный VISA.
Например: для нашего родного банка мы позволим делать переводы с карты на карту, возможность просмотреть детали по вкладу и внести наличные на карточный счёт в дополнение к обычным возможностям (баланс, выдача наличных), а для всех остальных только баланс и выдача.

Таким образом, мы должны загрузить неколько ФИТов в банкомат:

400001, 400002, 400003 — позволим всё и вся
999999 — только выдача и баланс


Сценарий проверяет номер карты клиента и работает по первому совпадению в ФИТ-таблице.

Итак, мы полностью подготовили весь комплекс к работе, осталось самое главное: совершить транзакцию.

Транзакция

Самый простой сценарий: наш клиент в нашем АТМ:

Клиент вставляет карту в АТМ;
АТМ видит что клиент наш и выдаёт ему опции;
Клиент выбирает: выдача, 100 рублей
Банкомат шифрует ПИН-блок мастер-ключом;
Шифрует всё сообщение коммуникационным ключом и отправляет в FrontEnd;
FrontEnd получает сообщение;
по ID определяет банкомат (каждый банкомат подключается на свой собственный порт, так что ID получить проблем никаких);
Расшифровывает сообщение открытой компонентой коммуникационого ключа;
по БИН понимает, что карта наша;
Расшифровывает ПИН-блок открытой компонентой мастер-ключа;
Обрабатывает запрос на списание (есть ли деньги, не исчерпаны ли лимиты и всё такое прочее);
Зашифровывает сообщение открытой компонентой коммуникационого ключа;
Отправляет банкомату;
Банкомат расшифровывает сообщение;
Сообщает результат клиенту;
Уведомляет хост, что деньги выданы (так же с шифрованием и всем прочим).


Стоит отметить, что всё шифрование на стороне хоста осуществляется при помощи HSM.
То есть шаги 8 и 9 в деталях выглядят так:

Хост отправляет зашифрованный ПИН-блок, мастер-ключ и контрольную сумму на HSM;
HSM расшифровывает ПИН-блок;
Сверяет контрольную сумму после расшифровки с присланной;
Зашифровывает открытый ПИН-блок при помощи IWK и считает контрольную сумму;
Если контрольные суммы открытого ПИН-блока и зашифрованного IWK равны — ПИН введён верно.


Клиент получает свои 100 рублей и уходит довольный, однако это только половина дела.

В этот момент FrontEnd установил клиенту hold — заморозил на его лимите авторизации (доступная к снятию сумма) 100 рублей, но его текущий счёт никак не изменился.

Здесь стоит немного пояснить: в процессинге нет счетов клиентов — движение денег происходит по так называемым «лимитам авторизации». Фактически, лимит авторизации — не что иное, как карточный счёт клиента, но он никак не фигурирует в плане счетов и бухгалтерском балансе.

Другими словами, лимит авторизации есть техническая сущность, которая отражает состояние реального текущего счёта клиента в процессинге. Отличие лимита авторизации в том, что:

на лимит авторизации действуют лимиты процессинга: лимит на единоразовую выдачу, лимит на ежедневную выдачу и так далее;
лимит авторизации может изменяться в течение операционного дня, текущий счёт только в момент закрытия операционного дня.


Вечером текущего дня или утром следующего дня (но, как правило, это делается ночью) закрывается операционный день. Все авторизации карт и суммы холдов выгружаются из FrontEnd и загружаются в BackEnd, где и происходит движение денег по текущим счетам клиентов. После этого финальные отчёты выгружаются в Автоматизированную Банковскую Систему, где хранятся текущие счета клиентов. На основании этих отчётов происходит реальное движение денег, а также во FrontEnd — новые лимиты авторизации (наш клиент из примера выше получает новый лимит авторизации, который меньше на 100 рублей).

Теперь сложнее: Чужой клиент в нашем АТМ:

Клиент вставляет карту в АТМ;
АТМ понимает что клиент чужой, показывает ему только баланс и выдачу;
Клиент выбирает: выдача, 200 рублей
АТМ шифрует ПИН-блок мастер-ключом;
Шифрует сообщение коммуникационным ключом;
Отправляет сообщение на FrontEnd;
FrontEnd расшифровывает сообщение открытой компонентой коммуникационого ключа;
Определяет что БИН не наш и надо его отправить в VISA;
FrontEnd зашифровывает сообщение компонентой AWK (так как мы в данном случае эквайер) и отправляет в VISA;
VISA получает от нас сообщение, расшифровывает его второй компонентой нашего AWK и по БИНу определяет какого банка это карта;
Зашифровывает сообщение компонентой IWK (так как обращается к эмитенту) того банка, который выпустил эту карту и отправляет сообщение;
Банк-эмитент получает сообщение:
Расшифровывает сообщение при помощи закрытой компоненты IWK (тут сразу понятно что карта наша, БИН смотреть нет смысла);
Расшифровывает ПИН-блок;
Авторизует карту (даёт добро на выдачу 200 рублей);
Зашифровывает сообщение закрытой компонентой IWK и отправляет в VISA;
VISA расшифровывает открытой компонентой IWK банка-эмитента, зашифровывает открытой компонентой AWK нашего банка и отправляет нам;
Мы расшифровываем сообщение закрытой компонентой AWK;
Записываем результат транзакции;
Зашифровываем открытой компонентой коммуникационого ключа нужного банкомата и отправляем ему сообщение;
Банкомат получает сообщение, расшифровывает его и выдаёт клиенту деньги;
Уведомляет хост, что деньги выданы (опять же, шифрую все сообщения);
Мы уведомляем банк-эмитент, что деньги успешно выданы;


Это была только авторизация, то есть реальных денег никто никому не перечислил. Теперь нам надо получить финсообщение об этой транзакции и получить возмещение от другого банка: 200 рублей наших денег, которые мы выдали его клиенту.

Мы отправляем в VISA отчёт (оффлайном, медленно и печально) о том, что не наш клиент с номером карты таким-то получил 200 рублей в нашем банкомате;
VISA отправляет требование банку-эмитенту перечислить нам 200 рублей и ещё 0,5% от суммы транзакции, но не менее $3 самой VISA за то, что она провела транзакцию через себя. Это есть так называемый interchange fee;
Банк-эмитент получает файлы от VISA, закрывает свой операционный день в процессинге, потом закрывает день в Автоматизированной Банковской Системе и переводит через корр. банк VISA на наш счёт наших 200 рублей;
Рассчитывается с VISA (покрывает interchange fee)


Само собой, все такие расчёты осуществляются в долларах, и тут играет роль курсовая разница, но это уже совсем другая история…

UPD: В комментариях, товарищ Spewow привёл ссылку на статью о HSM и криптографии

UPD2:И мною была обнаружена статья, где более подробно описана архитектура ПО для банкоматов (XFS): habrahabr.ru/post/93507/