Folosind $$token = SHA256(APIKey \mathbin\| SecretKey \mathbin\| expireTimestamp) \mathbin\| expireTimestamp$$
nu este sigur, deoarece poate provoca un atac de extensie de lungime ca;
$$token2 = SHA256(APIKey \mathbin\| SecretKey \mathbin\| expireTimestamp \| \color{red}{extension}) \mathbin\| (expireTimestamp \| \color{red}{extension}) $$
Acesta este un simbol valid pentru fals.
NIST la apel pentru candidații SHA3 trebuie să fie rezistent la prelungirea lungimii
atacuri. Keccak l-a numit acum câștigător pe SHA3, iar Blake2 este încă o alternativă bună la competiție. Ambele sunt rezistente la atacurile de extensie de lungime, Keccak folosind capacitatea și Blake2 o folosește HAIFA construcție, sunt sigure la atacurile de extensie de lungime.
Pentru a reduce se poate folosi HMAC;
$$token = \operatorname{HMAC-SHA256}(privateKey, publicKey \mathbin\| expireTimestamp) \mathbin\| expireTimestamp$$ Rețineți că aceasta va apela SHA-256 de cel puțin două ori (de trei ori dacă cheia este mai mare decât dimensiunea blocului funcției hash, 512 biți pentru SHA-256).
În loc de HMAC, putem folosi BLAKE2. BLAKE2 este foarte rapid și chiar și noi avem o versiune paralelă BLAKE3 si folosind
$$token = \operatorname{BLAKE2}( publicKey \mathbin\| privateKey \mathbin\|expireTimestamp) \mathbin\| expireTimestamp$$ este sigur.
NIST a standardizat, de asemenea, un MAC pentru SHA3 numit KMAC(sau Aici).
Atât BLAKE2 cât și KMAC sunt de preferat HMAC.
Dacă insistați să utilizați SHA2 cu o dimensiune de ieșire de 256 de biți, atunci utilizați SHA-512/256, care este versiunea trunchiată a SHA-512/256 cu valori inițiale diferite pentru a separa domeniile. SHA-512/256 este imun la atacurile de extensie de lungime și este prietenos cu procesorul pe 64 de biți prin design.