V ideálním případě by hash hesla měl vzniknout už u klienta a server by se nehashované heslo neměl nikdy dozvědět. Ale budu řešit současný reálný stav, kdy se na bezpečnost kašle.
Sůl bych raději generoval v aplikaci, máte pak víc pod kontrolou její parametry, např. jak bude náhodná. Také omezíte prostředí, kde se heslo vyskytuje jen v otevřeném tvaru (bude to jen vaše aplikace, databáze otevřené heslo nikdy neuvidí).
Dále, když chcete hesla zabezpečovat tímhle způsobem, bych doporučil kombinovat dvě soli – jednu náhodnou individuální pro každé heslo (která bude uložená spolu s tím heslem), a druhou globální, která vůbec nebude uložená v databázi. Pokud by pak došlo k úniku dat z databáze, nemůže útočník hádat heslo ani jednoho vybraného uživatele, protože mu bude chybět ta globální sůl. (Samozřejmě to není všespásné, pokud útočník získá administrátorská práva na serveru, kde běží aplikace i databáze, získá jak databázi tak globální sůl. Ale bohužel jsou překvapivě časté úniky, kdy útočník získá jen data z databáze.)
Také bych doporučoval ukládat si k heslu a soli i ID „algoritmu“, kterým jste to vytvořil (klidně jen pořadové číslo verze). To vám umožní v budoucnosti plynule změnit třeba hashovací algoritmus, globální hash nebo prostě celý způsob, jak „hesla“ ukládáte.