ehm, se tu trovi una serie di chiavi che collidono, guardandole, personalmente, appena noterei che una delle chiavi contiene il captcha mi renderei da conto subito quale sarebbe il salt

verificata quest'ipotesi con qualche chiave, una volta che so che all'inizio ci sta il captcha e che la secret è pippo rigenero l'hash aggiungendo SOLAMENTE pippo alla fine dei miei captcha finti

ergo, se:
f7b2993185f755d2212840328001bb2f

è composto da
pippo123

E' perfettamente normale che l'hash di pippo123123 sia diverso da pippo123, ma pippo è il captcha che vedi a video quindi, una volta visto che il captcha è pippo, ed appurato questo controllo con un altro paio di captcha o direttamente con un test, tutti gli hash che passo alla pagina php li genero inserendo 123 alla fine e mi sono risolto il problema perché il codice che fa il controllo riceve la stringa del captcha che passo, appende 123 e poi effettua un confronto tra l'hash ricevuto dal browser, che è pure manomesso, e l'hash che a generato lui con il captcha passato

Certo è che se uno trova la chiave usata per generare pippo123 e non si accorge da solo che contiene il captcha è tonto o è un ragazzino che non sa come passare il proprio tempo ... ma per quello non c'è che fare

---

tutto ciò non vuol dire che l'md5 non serva, però usarlo cosi è più pericoloso ... come dicevo l'HMAC-MD5, che si può implementare con poche righe di codice, da già un livello di sicurezza in più

Qui c'è del PSEUDO CODE
codice:
function hmac (key, message)
    opad = [0x5c * blocksize] // Where blocksize is that of the underlying hash function
    ipad = [0x36 * blocksize]

    if (length(key) > blocksize) then
        key = hash(key) // keys longer than blocksize are shortened
    end if

    for i from 0 to length(key) - 1 step 1
        ipad[i] = ipad[i] XOR key[i]
        opad[i] = opad[i] XOR key[i]
    end for

    return hash(opad || hash(ipad || message)) // Where || is concatenation
end function
preso direttamente da wikipedia
http://en.wikipedia.org/wiki/HMAC

come vedete con questo giochino si complica un pò di più la vita a chi vuol far danni ... non è la panacea di tutti i mali ma minimo raddoppia i tempi per trovare le collisioni dell'hash di base.

In alternativa l'HMAC-SHA1 da un minimo di sicurezza in più derivata dal fatto che ci vuole più tempo a trovare le collisioni con lo SHA-1

O, ancora meglio, chi usa PHP5 può utilizzare
http://www.php.net/manual/en/function.hash.php
http://www.php.net/manual/en/function.hash-algos.php

Che supporta un sacco di algorittimi di hashing

L'algorittimo di hashing
Whirlpool

è tra i più sicuri
http://en.wikipedia.org/wiki/Whirlpool_(cryptography)