Un număr standard de card de credit are entropie limitată. Pe ISO/IEC 7812 primele 6 cifre sunt fixate pentru un anumit emitent de card, iar cea mai simplă presupunere prudentă este că sunt cunoscute atacatorilor. Ultima cifră este o funcție publică a celorlalte. Pentru numerele de card de credit din 16 cifre, rămân 9 cifre (în cel mai bun caz <30 de biți de entropie). Aceasta poate fi crescută doar ușor (cum ar fi 5 biți) utilizând data de expirare.
Aceasta implică că nu putem folosi o funcție rapidă și publică (cum sunt hashurile, dacă nu se specifică altfel) și să obținem unilateralitatea dorită. Și că orice funcție publică lentă va avea o securitate limitată. În plus, dimensiunea este prea mică pentru criptografia cu cheie publică.
Concluzionam că putem folosi doar criptografia simetrică, cu cheie secretă. Format Păstrarea criptării e departe. Am putea folosi și un reformatat Cod de autentificare a mesajului, dar trebuie să ne temem de coliziuni și va oferi o asigurare de integritate ceva mai puțin robustă decât FPE.
La cerere în cometariu, voi detalia un MAC reformatat. Presupun că rezultatul trebuie să fie de 16 cifre zecimale, fără altă constrângere. Aceasta înseamnă că suntem dispuși să tolerăm o probabilitate scăzută de coliziune: pentru $n$ numere de carduri de care probabilitatea va fi delimitată de sus $n\,(n-1)/(2\cdot10^{16})$; vedea acest. De exemplu, trebuie să fim mulțumiți cu o încredere de 99% că nu există nicio coliziune între până la 14 milioane de numere de card (alese fără cunoașterea cheii).
- Să presupunem o cheie secretă fixă cu entropie de cel puțin 128 de biți
- Calcula HMAC-SHA-256 din numărul cardului de credit și cheia, cu
dimensiunea de iesire
= 32 de octeți
- Considerați rezultatul ca un număr întreg în $[0,2^{256})$ (după convenția big-endian), reduceți-o modulo $10^{16}$, și exprimă rezultatul ca 16 cifre zecimale (cu zerouri înainte, dacă este necesar), formând simbolul.
În esență, este imposibil să inversezi acea tokenizare fără acces la cheie sau la un dispozitiv cu cheie; dar acest lucru este posibil cu cheie și efort moderat, prin încercare și eroare asupra numerelor de card de credit.
Dacă vrem în plus să facem oarecum dificilă inversarea pentru unul cu cheia, putem înlocui HMAC-SHA-256 cu Argon2 (numărul cardului de credit este introdus ca parolă, cheia ca cheie, sare fixă, tagLength
= 32 de octeți), parametrizați pentru a încetini lucrurile cât de mult este posibil. Acest lucru nu schimbă probabilitatea de coliziune, dar securitatea este îmbunătățită: presupunând că Argon2 este parametrizat pentru 0,1 secunde de timp de calcul al unui anumit PC; atacatorul are 100 de PC-uri similare; 9 cifre ale numărului cardului de credit sunt total aleatorii, 6 sunt cunoscute, iar ultima cifră este o sumă de control obișnuită; atunci va fi nevoie în medie de un milion de secunde (11,6 zile) pentru a inversa un anumit hash sau 1 secundă pentru a inversa un hash dintr-un milion de hashe-uri date.
Dacă nu putem trăi cu riscul de coliziune, trebuie să folosim criptarea cu păstrarea formatului, dar pierdem din dificultate să inversăm pentru unul care deține cheia. FPE care este semnificativ mai greu de calculat în direcția inversă nu este standard, dar de imaginat, vezi asta întrebare.