Я реализовал это один раз. Я использую 4-значный ключ с подмножеством символов (обратите внимание, что потенциально сбивающие с толку символы, такие как 0oO и l1L, удалены. Я использовал 4 символа, потому что потенциальный пробел из 4 цифр из набора символов был больше, чем 6 цифр ключа RSA.
В любом случае, я позволил пользователю войти в систему со своим именем пользователя и паролем. Если это правильно, сгенерируйте ключ и отправьте его на телефон, сохраните в сеансе и покажите пользователю следующую страницу, для которой требуется ввести ключ. Пользователь получает 4-значный ключ со своего телефона и вводит его на страницу. Затем проверьте, что они ввели против сохраненного в сеансе ключа, и все.
Некоторые удобные функции: срок действия ключа истекает через несколько минут, но достаточно долго, чтобы задержки при отправке текстовых сообщений не делали его невозможным. Заставьте его истечь после нескольких неудачных попыток. Дайте пользователям ссылку для повторной отправки ключа или для отправки нового ключа.
//pick a random 4 digit string
$chars = "abcdefghjkrstwxyzABCDEFGHJKRSTWXYZ23456789";
$key = "";
for($i=0;$i<4;$i++){
//here, rand is used, but any generator could be used
//to choose the characters.
$key .= $chars[rand(0,strlen($chars)-1)];
}
//save it to the session
$_SESSION['test']['KEY'] = $key;