A salt can be a random value and length. The hash and the salt are stored in the database.
Is there a separate salt generator function used? Is it just a random generator?
Does it need to be a CSPRNG? It's just being stored in plaintext next to the hash to prevent dictionary attacks. Similarly to nonces, could a salt just be random or pseudorandom?
Are the salt generators combined with the other security functions, like key stretching and hashing, into one overall hash function which outputs the salt and hash?