우리는 api를 통해 사용자를 인증하기 위해 hmac 기반 일회용 암호 프로토콜을 구현하려고합니다.hmac 기반 일회용 비밀번호 구현에서 카운터를위한 클라이언트와 서버 간의 카운터 동기화를 보장하는 방법은 무엇입니까?
아이디어는 개인 키와 증분 카운터에 대해 사용자 (uid)의 고유 식별자를 암호화하는 것입니다. 그런 다음 다음 통화를 위해 카운터를 증가시킵니다.
encrypt(uid, private_key, counter)
# now increment the counter for the next call
그런 다음 서버 측에서 개인 키와 카운터를 사용하여 암호 해독하여 사용자 식별자 (uid)를 가져옵니다.
decrypt(encrpyted_string, private_key, counter)
# now increment the counter for the next received request
잘 작동합니다. 각 통화는 카운터 때문에 완전히 고유합니다 (한 번).
그러나 카운터의 동기화는 어떻게 처리합니까? 클라이언트가 요청을 생성하고 다음 호출을 위해 카운터를 증가 시키며 요청을 보냈지 만 서버가 오프라인 상태이며 요청을받지 못하거나 인터넷 연결 문제가 발생하여 요청이 처리되지 않으면 어떻게됩니까? 클라이언트가 서로의 카운터와 동기화되지 않습니다.
"요청을 제출했는지 알아야합니까?" 나는. 우리는 서버에서 응답 헤더를 추가하여 카운터가 증가되었는지 여부와 이 포함 된 경우에만 카운터를 앱에서 증가시킬 수 있습니다. ... 그런 다음 다른 방법으로 말할 수 있습니다. 요청을 보내면 서버가 자체 카운터를 증가시키고 응답을 보냅니다. 그러나 서버가 요청을 처리하는 동안 인터넷 연결이 중단되어 응용 프로그램이 응답을받지 못하면 카운터가 증가하지 않으므로 두 개가 꺼집니다. 다시 동기화합니다.
아무런 통찰력을 주셔서 감사합니다.