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.
- Café: složené é nebo e s přízvukem
- NFC → dohodnutá posloupnost znaků
- 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.