tot ce va face hashingul este să introducă mai multă aleatorie
Nu. Nu poți introduce aleatorietatea printr-un proces determinist. Puteți introduce aleatorie doar cu o sursă reală de date aleatorii.
Puteți folosi un hash ca a componentă a unui generator pseudoaleator și un generator pseudoaleatoriu (securizat din punct de vedere criptografic!) este suficient de bun pentru criptografie unde este nevoie de aleatorie, dar o altă componentă vitală a unui generator pseudoaleator este un secret. Acest secret este starea generatorului aleatoriu, care este derivat dintr-o sămânță aleatorie: un generator pseudoaleatoriu nu creează aleatoriu, ci doar „îl „multipește” în sensul că poate transforma o cantitate mică de date aleatoare într-o cantitate mare. cantitatea de date aleatorii.
Hashingul unui șir aleatoriu reduce doar aleatoritatea acestuia: este teoretic posibil ca două șiruri de intrare să aibă același hash (nu veți găsi de fapt astfel de șiruri și nu suntem siguri că există, dar sunt șanse să existe). Aleatoria este redusă doar cu o cantitate mică, așa că aceasta nu este o vulnerabilitate reală a codului dvs., dar este o complicație inutilă și contraproductivă.
Modul de a maximiza aleatorietatea este de a obține rezultate de la un generator aleatoriu. Apel rng.GetBytes(secretkey)
si opreste-te acolo.
Convertirea cheii în Base64 pentru transport și apoi înapoi în binar pentru utilizare nu are niciun impact asupra criptografiei. Este doar o codificare. Decodați-l: utilizarea Base64 ca cheie ar putea reduce securitatea, deoarece fiecare octet poate avea doar 1/4 din valorile posibile. (Modul în care HMAC își folosește cheia, de fapt nu ar conta dacă utilizați base64(random_bytes(64))
sau random_bytes(64)
ca cheie; dar acest lucru ar conta, de exemplu, pentru o cheie AES, care nici măcar nu ar avea o lungime acceptabilă.)