In my application, the user logs in when connected to the central database, and their login credentials are authenticated against that data and cached (encrypted). Then, when the user is offline, their credentials are authenticated against that cache. So far so good.
But sometimes, the user MUST use the application when offline AND the data cache is corrupted, so they can't get log in. There is no possibility of accessing the internet, even via mobile phone hotspot, but it is still mission critical to be able to run the application, and there is no time to go somewhere and try to find an internet connection.
So I have been tasked to implement an offline login method so that the user can call tech support from a landline at the facility and verbally receive a code that they can enter and the software will recognize this and treat it as a valid authentication. Because the transfer is via human voice, this code has to be reasonably short and human comprehensible (i.e. not a 100 character base64 encoded string).
The code must embed at least a user id (integer) and expiration date (could also be just an integer, like the number of days since 1/1/2022) and will only be given to the same person once on the same day, so the current date could function as a one time pad.
Also, it doesn't need to be massively secure, just enough to prevent someone guessing tomorrow's code by trial and error. (They have the installed application binary, so with sufficient skills, they could just debug it and bypass the authentication code altogether; I'm not trying to keep out the NSA, just the "ordinary" troublemaker.)
How might this be done?