Affinché un hash sia privo di collisioni, ogni input univoco dovrebbe essere mappato su un output univoco. Se ogni uscita è unica, ciò significa che può essere mappato in senso inverso a un input univoco. Quello non sarebbe hashing, sarebbe solo una codifica. La collisione e la non reversibilità si escludono a vicenda per definizione.
Il punto importante è come probabile è una collisione, e la risposta per gli hash moderni è negligibilmente improbabile . Se lo spazio della chiave di output è maggiore dello spazio della chiave di input, è estremamente improbabile che tu possa trovare una collisione, e anche se non è così improbabile da non meritare di essere preso in considerazione nel mondo reale.
Direi che quegli ID di smart card non sono molto complessi, probabilmente numeri decimali della stessa lunghezza (ad esempio 1234567890). Ciò significa che non ci sono molti input possibili ed è probabilmente possibile calcolare gli hash di tutti i possibili ID in un tempo ragionevole, creando una tabella di ricerca per invertire gli hash. In questo caso, ti consigliamo di utilizzare un hash lento come bcrypt, scrypt, PBKDF2 ecc. Per rendere questo non possibile.
Più ci penso, meno il requisito ha senso. Il segreto qui dovrebbe essere tra la carta e il lettore, e trust deve essere tra il lettore e il sistema a cui è connesso. Perché è un problema di sicurezza se è noto l'ID di una carta? Cosa può fare qualcuno con questo id se lo ottiene? Se la risposta è che l'ID è un segreto e qualcuno può fare quello che vuole se conosce il numero di identificazione, questa è una scarsa sicurezza. La sicurezza qui dovrebbe derivare dal fatto che è necessario avere il possesso fisico della carta, il che significa che i segreti sono tutti tra la carta e il lettore. Oltre a questo c'è solo un utente autenticato con un id, che è una necessità semplice per far funzionare il sistema.