sử dụng $$token = SHA256(APIKey \mathbin\| SecretKey \mathbin\| expireTimestamp) \mathbin\| hết hạnDấu thời gian$$
không an toàn vì nó có thể gây ra một cuộc tấn công kéo dài như;
$$token2 = SHA256(APIKey \mathbin\| SecretKey \mathbin\| expireTimestamp \| \color{red}{extension}) \mathbin\| (dấu thời gian hết hạn \| \color{red}{extension}) $$
Đây là một mã thông báo hợp lệ cho việc giả mạo.
NIST khi gọi tới các ứng cử viên SHA3 bắt buộc phải là chống kéo dài
tấn công. Keccak hiện đã đặt tên SHA3 là người chiến thắng và Blake2 vẫn là một lựa chọn thay thế tốt trong cuộc thi. Cả hai đều có khả năng chống lại các cuộc tấn công mở rộng chiều dài, Keccak bằng cách sử dụng năng lực và Blake2 đang sử dụng HAIFA xây dựng, an toàn cho các cuộc tấn công mở rộng kéo dài.
Để giảm thiểu, người ta có thể sử dụng HMAC;
$$token = \operatorname{HMAC-SHA256}(privateKey, publicKey \mathbin\| expireTimestamp) \mathbin\| hết hạnDấu thời gian$$ Lưu ý rằng điều này sẽ gọi SHA-256 ít nhất hai lần ( ba lần nếu khóa dài hơn kích thước khối của hàm băm, 512-bit cho SHA-256).
Thay vì HMAC, chúng ta có thể sử dụng BLAKE2. BLAKE2 rất nhanh và thậm chí chúng tôi còn có phiên bản song song BLACK3 và sử dụng
$$token = \operatorname{BLAKE2}( publicKey \mathbin\| privateKey \mathbin\|expireTimestamp) \mathbin\| hết hạnDấu thời gian$$ an toàn.
NIST cũng chuẩn hóa MAC cho SHA3 có tên KMAC( hoặc đây).
Cả BLAKE2 và KMAC đều thích hợp hơn HMAC.
Nếu bạn khăng khăng sử dụng SHA2 với kích thước đầu ra 256 bit thì hãy sử dụng SHA-512/256, đây là phiên bản rút gọn của SHA-512/256 với các giá trị ban đầu khác nhau để phân tách các miền. SHA-512/256 miễn nhiễm với các cuộc tấn công mở rộng độ dài và nó thân thiện với CPU 64 bit theo thiết kế.