Ваша схема будет работать, НО она не достигает своего полного потенциала безопасности, учитывая тот факт, что вы можете перенести новый сгенерированный токен авторизации с уже авторизованного устройства напрямую на другое (через QR-код, считываемый камерой);этот факт сделает шаги 3 и 4 ненужной уязвимостью (это также избыточность, уже есть токен !, зачем нужен другой?);
Следующая альтернатива наряду с хорошей криптографией может сделать позднее авторизованное устройствосоединение практически невозможно нарушить. Идея состоит в том, что, добавив слой симметричного шифрования перед отправкой данных на шаге 5 и используя ключ, которым обмениваются на другой носитель (уже авторизованное устройство и сервер), зашифрованные данные никогда не могут быть раскрыты;
замена шага 3: прочитайте токен авторизации;
замена шага 4: проверьте безопасный вывод хеш-кода токена авторизации (вместо самого токена) с сервером, чтобы убедиться, что он действителен;
token0=read_auth_token_from_camera()
public_token=hash_function(token0) //the useless exposed token
if(check_token_with_server_for_authenticity(public_token)==true)
continue_to_step_5() //it's authorized
else
handle_the_scenario()
замена шага 5: зашифруйте ваш запрос и токен авторизации с помощью другого хеш-кода для токена авторизации, затем выполните вызовы к API сервера;
token2=another_hash_function(token0)
request="i am top secret data"
encryption_key=token0
encrypted_request=encryption_function( token2 + request , encryption_key)
send_to_server( public_token+encrypted_request)
//notice that token2 is unknown to the intruder because its encrypted,but it is known to the server; hence the authenticity of each request can be checked by the server;
как это более безопасно: вэтот альтернативный способ фактического токена авторизацииникогда не обменивается между сервером и новым клиентом;Поэтому, если злоумышленник может гипотетически нарушить уровень SSl / TLS и перехватить общедоступный токен, злоумышленник не сможет отправлять какие-либо запросы от вашего имени или изменять данные в запросах;