Il digest di hash di esempio che hai dato è troppo corto (20 bit o circa un milione di possibilità), quindi potresti ottenere collisioni troppo spesso e, peggio, chiunque decompilasse il tuo programma potrebbe produrre banalmente le stringhe corrette (o , almeno, stringhe accettabili a causa di collisioni hash) solo forzando brutemente il probabile spazio di input.
"Questa è una stupida obiezione, è solo un esempio ..." si potrebbe dire, ma in realtà non lo è. Ho trovato e sfruttato questo esatto tipo di debolezza prima. Ad esempio, c'era un'app mobile che utilizzava una funzione hash a 32 bit sugli input dell'utente per cercare di nascondere quali input avrebbero prodotto gli output. Ci è voluta meno di un'ora per scrivere ed eseguire un programma che costringeva brutalmente lo spazio di ricerca e ha trovato input mappati su ogni hash digest che l'app stava cercando.
In pratica, è come cercare di memorizzare le password in modo sicuro. Ci sono sicuramente delle differenze - le password raramente sono molto lunghe, mentre le stringhe con hardcoded in un programma possono essere, e se si esegue spesso il test di uguaglianza delle stringhe allora non ci si può permettere che sia lento come una buona funzione di verifica della password essere - ma molti degli stessi paralleli hanno. Usa una strong funzione di hash, non solo elastico per le collisioni e l'inversione, ma anche idealmente uno che non è così veloce che è possibile forzare l'intero spazio di ricerca. Per le stringhe brevi, usa un valore in modo che le persone non possano semplicemente cercare il valore in una tabella arcobaleno.
Ora, per quanto riguarda l'effettiva offuscazione: questa tecnica è una (di molte) che può essere utilizzata dall'offuscamento. Di solito non è molto efficace, specialmente se implementato debolmente (vedi il mio secondo paragrafo), e ha un impatto sulle prestazioni sufficiente che non viene solitamente utilizzato se non in modo selettivo in luoghi in cui il rallentamento non è un grosso problema. L'offuscamento in generale è una non soluzione; nel migliore dei casi rallenta il reverse engineering abbastanza che al momento in cui il RE è completo, il codebase è abbastanza vecchio, a cui nessuno importa, senza causare indebite prestazioni o bug di logica del programma nel frattempo. In pratica, però, di solito non è così bello.