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