Basic implementation of {@link TokenService} that is compatible with clusters and across machine restarts,without requiring database persistence.
Keys are produced in the format:
Base64(creationTime + ":" + hex(pseudoRandomNumber) + ":" + extendedInformation + ":" + Sha512Hex(creationTime + ":" + hex(pseudoRandomNumber) + ":" + extendedInformation + ":" + serverSecret) )
In the above, creationTime, tokenKey and extendedInformation are equal to that stored in {@link Token}. The Sha512Hex includes the same payload, plus a serverSecret.
The serverSecret varies every millisecond. It relies on two static server-side secrets. The first is a password, and the second is a server integer. Both of these must remain the same for any issued keys to subsequently be recognised. The applicable serverSecret in any millisecond is computed by password + ":" + (creationTime % serverInteger). This approach further obfuscates the actual server secret and renders attempts to compute the server secret more limited in usefulness (as any false tokens would be forced to have a creationTime equal to the computed hash). Recall that framework features depending on token services should reject tokens that are relatively old in any event.
A further consideration of this class is the requirement for cryptographically strong pseudo-random numbers. To this end, the use of {@link SecureRandomFactoryBean} is recommended to inject the property.
This implementation uses UTF-8 encoding internally for string manipulation.
@author Ben Alex