Skip to content
On this page

Problémy s hashováním

Kolize hashovacích algorytmů

Hashování je velmi zajímavý proces, co je na něm velmi zajímavé je, že vždy vygeneruje náhodnou hodnotu, která je však vždy stejně velká - např 256 bitů. Jelikož však přijímá jakoukoliv velikost hodnoty jako vstup, Můžeme narazit na kolizi - Dva různé vstupy mají stejný výstup.

To sice není problém u moderních algorytmů, jelikož vygenerování dvou vstupů, které budou mít stejný výstup je astronomicky obtížné, problém je však u jednoduchých algorymů, jako je třeba crc32, u kterého nám stačí změnit 4 bity abychom dosáhli jakéhokoliv výstupu.[0]

Magický hash

Dalším velmi známým problémem s hashema je kolize s čísly. Ano, i přes to jak hloupě toto zní, je možné, že hash bude konfliktovat s číslem. Nejde už úplně o problém s hashováním, ale jde o problém s porovnáváním hodnot. Pokud v PHP používáme == místo ===, který kontroluje i datový typ proměné, je možné, že vygenerovaný hash začíná textem "0e". Takovou hodnotu PHP automaticky převede na float číslo s hodnotou 0, jelikož si to myslí, že jde o vědecký zápis čísla.

Pokud hash uložený ve stránce začíná pomocí "0e" a hash námi zadaného hesla také vyprodukuje něco co začíná na "0e", porovnávání nás může pustit ikdyž hodnoty nejsou ani zdaleka stejné. Narozdíl od konfliktu hashovacích algorytmů, existují i magické hashe pro sha256 a jiné dnes používané algorytmy.

Shrnutí

  • Ikdyž používáme hashe, je nutné si uvědomit že musíme používat bezpečné algorytmy a musíme je bezpečně implementovat
  • Vetšinou je nejlepší nechat tyto složité kryptografické operace na knihovnách, které používáme.

Zdroje

0: https://www.nayuki.io/page/forcing-a-files-crc-to-any-value