Text a kód / Návody

Proč může mít na pohled stejný text různé hash hodnoty

Hash shrnuje bajty. Lidské oči vidí znaky; Unicode povoluje více než jednu sekvenci bajtů pro nějaký zdánlivě identický text.

Jedno viditelné písmeno, dvě sekvence

Slovo Café může obsahovat jediné složené é s kódovým bodem U+00E9 nebo písmeno e následované kombinující čárkou U+0301. Mnohá písma oba zápisy zobrazí podobně. Složené é má v UTF-8 bajty C3 A9, rozložený zápis na konci slova bajty 65 CC 81. SHA-256 počítá otisk z bajtů, a proto tyto dvě podoby dají odlišné výsledky, ačkoli čtenář vidí stejné slovo. Nejde o chybu hashování; jde o rozdíl mezi vizuální a bajtovou shodou. Při zkoumání rozdílu zachovejte původní zápis.

Normalizovat na základě výslovné dohody

Unicode NFC skládá vhodné sekvence do kanonické formy; NFD je rozkládá. Pokud se dva systémy dohodnou na normalizaci na NFC před kódováním jako UTF-8 a hašováním, dosáhnou dva pravopisy Café v příkladu stejné kanonické sekvence bajtů. Vestavěný nástroj NFC vám umožňuje testovat rozložený vstup. Na pořadí záleží: normalizujte znaky, zakódujte tyto znaky do UTF-8 bajtů a poté přesné bajty hashujte. Hašování nejprve zničí informace potřebné ke sladění ekvivalentních pravopisů. Zdokumentujte normalizační formulář v datové smlouvě, aby každý účastník provedl stejnou operaci.

Pokud to vyžaduje dohoda, normalizovat před kódováním a hashováním.
  1. Café: složené é nebo e s přízvukem
  2. NFC → dohodnutá posloupnost znaků
  3. Bajty UTF-8 → otisk SHA-256

Nenormalizujte vše slepě

Normalizace může změnit přesný zdrojový text a formy kompatibility NFKC a NFKD umožňují širší substituce než NFC a NFD. To může být užitečné pro vyhledávací index, ale nevhodné pro právní přepis, digitální podpis nad existujícím dokumentem nebo systém, který slibuje archivaci bajt po bajtu. Sjednocení velikosti písmen, ořezávání mezer a změna zakončení řádků jsou další možnosti, nikoli automatické součásti NFC. Specifikace protokolu může vyžadovat původní bajty nebo definovat jiný postup kanonizace. Po zjištění neshody se řiďte tímto pravidlem namísto použití normalizace.

Zkontrolujte bajty řízeným testem

Vytvořte dva krátké řetězce: jeden se složeným é a jeden s e plus znak spojení. Spusťte každý pomocí prohlížeče bajtů UTF-8 a na konci si poznamenejte C3 A9 versus 65 CC 81. Hashujte nezpracované řetězce samostatně; jejich trávení by se mělo lišit. Poté na každý použijte NFC, znovu zkontrolujte jejich bajty a porovnejte SHA-256 digesty. Dávejte pozor na mezery, nové řádky a skryté znaky v zkopírovaném vstupu, což může také změnit výtah. Test by měl porovnávat identické algoritmy a kódování; hodnotu SHA-256 nelze přímo srovnávat s SHA-512.

Vyberte si srovnání, které skutečně potřebujete

Pro kontrolu integrity souboru je obvykle důležité hašování původních bajtů: každá změna bajtu by měla být viditelná. Pro deduplikaci názvů zadaných člověkem může mít smysl dokumentovaná politika normalizace textu před hashováním, ačkoli jména mají také problémy s velikostí písmen a jazykem, které jediný formulář Unicode nevyřeší. U hesel a ověřování se normalizaci a hašování hesel řídí vyhrazenými návrhy zabezpečení; prosté heslo SHA-256 není dostatečné úložiště. Uveďte, zda je cílem bajtová identita, ekvivalence normalizovaného textu nebo lidská podobnost. To jsou různé přísliby a žádný převaděč nemůže usuzovat zamýšlený jen ze vzhledu.

Před zavedením pravidla normalizace napište dva testy: stejný viditelný text ve složené a rozložené podobě a záměrně odlišný text. První test má po zvolené normalizaci vést ke stejným bajtům; druhý se nesmí nečekaně sloučit. Tak ověříte přesný účel pravidla, nikoli jen to, že hashovací funkce vrátí nějaký výsledek. Změny pravidla je třeba verzovat spolu s uloženými daty.

Vyzkoušet převodník

Normalizujte rozložené slovo s diakritikou na NFC.

NFC znaky kanonicky rozloží a znovu složí do běžného složeného tvaru. Převeďte údaje lokálně v prohlížeči.

Otevřít celý převodník

Další návody

Návody ke konverzím

Prohlédnout návody