В чем заключается принцип работы банковских (и не только) токенов?
Они работают на математических функциях, а для вычисления каждого ключа (под ключем я имею в виду то число, которое генерируется, и которое вы вводите для авторизации) используется либо счетчик, либо последовательное хеширование.

Грубо говоря, в токене зашита некоторая односторонняя функция f(x), и некоторое стартовое число k. Сервер также знает, какая функция и какое число используется в токене, привязанном к вашему аккаунту. 

Если это модель со счетчиком, то с помощью вашей функции вычисляется f(k), а затем k увеличивается на единицу (или изменяется как угодно еще, главное чтобы по известному алгоритму). Если это последовательные вычисления ключа, то каждый следующий ключ это результат работы функции на предыдущем ключе, то есть вычисляется f(k), потом f(f(k)), f(f(f(k))), и так далее.

Соответственно каждый раз, когда вы нажимаете на кнопку, токен вычисляет следующий ключ. Когда вы вводите его для авторизации, сервер также вычисляет тот же самый ключ и сравнивает их.
Как вариант, банку вообще не нужно знать этот одноразовый пароль. Ему достаточно получить некий документ, подписанный ЭЦП, зарегистрированной в банке (удостоверяющем центре) за конкретным клиентом. В токен встроены криптосредства, которым на вход подаёшь документ, авторизуешься по одноразовому паролю для подписания закрытым ключом (он хранится в токене, возможности получить его средствами токена нет), а на выходе получаешь ЭЦП документа, которая вместе с документом передаётся в банк и там проверяется (разумеется, в банке должен быть открытый ключ, соответствующий закрытому).