Jedno viditeľné písmeno, dve sekvencie
Slovo Café môže obsahovať jedno zložené é s kódovým bodom U+00E9 alebo písmeno e nasledované kombinačným dĺžňom U+0301. Mnohé písma oba zápisy zobrazia podobne. Zložené é má v UTF-8 bajty C3 A9, rozložený zápis na konci slova bajty 65 CC 81. SHA-256 počíta súhrn z bajtov, a preto tieto dve podoby dajú odlišné výsledky, hoci čitateľ vidí to isté slovo. Nie je to chyba hashovania; ide o rozdiel medzi vizuálnou a bajtovou rovnosťou. Pri skúmaní rozdielu zachovajte pôvodný zápis.
Normalizovať na základe výslovnej dohody
Unicode NFC skladá vhodné sekvencie do kanonickej formy; NFD ich rozkladá. Ak sa dva systémy dohodnú na normalizácii na NFC pred kódovaním ako UTF-8 a hašovaním, dva pravopisy Café v príklade dosiahnu rovnakú kanonickú postupnosť bajtov. Vstavaný nástroj NFC vám umožňuje testovať rozložený vstup. Na poradí záleží: normalizujte znaky, zakódujte ich do UTF-8 bajtov a potom presné bajty hashujte. Hašovanie najskôr zničí informácie potrebné na zosúladenie ekvivalentných pravopisov. Formulár normalizácie zdokumentujte v zmluve o údajoch, aby každý účastník vykonal rovnakú operáciu.
- Café: zložené é alebo e s prízvukom
- NFC → dohodnutá postupnosť znakov
- Bajty UTF-8 → súhrn SHA-256
Nenormalizujte všetko slepo
Normalizácia môže zmeniť presný zdrojový text a formy kompatibility NFKC a NFKD vytvárajú širšie substitúcie ako NFC a NFD. To môže byť užitočné pre index vyhľadávania, ale nevhodné pre právny prepis, digitálny podpis na existujúcom dokumente alebo systém, ktorý sľubuje archiváciu po bajtoch. Zjednotenie veľkosti písmen, orezávanie medzier a zmena koncov čiar sú ďalšie možnosti, nie automatické súčasti NFC. Špecifikácia protokolu môže vyžadovať pôvodné bajty alebo definovať iný postup kanonizácie. Po zistení nesúladu dodržujte toto pravidlo namiesto použitia normalizácie.
Skontrolujte bajty kontrolovaným testom
Vytvorte dva krátke reťazce: jeden so zloženým é a druhý s e plus znak spojenia. Spustite každý cez prehliadač UTF-8 bajtov a na konci si všimnite C3 A9 verzus 65 CC 81. Samostatne hashujte surové reťazce; ich trávenie by sa malo líšiť. Potom na každý použite NFC, znova skontrolujte ich bajty a porovnajte súhrny SHA-256. Dávajte pozor na medzery, nové riadky a skryté znaky v skopírovanom vstupe, čo môže tiež zmeniť súhrn. Test by mal porovnávať identické algoritmy a kódovania; hodnotu SHA-256 nemožno porovnávať priamo s hodnotou SHA-512.
Vyberte si porovnanie, ktoré skutočne potrebujete
Pri kontrole integrity súboru je zvyčajne dôležité hašovanie pôvodných bajtov: každá zmena bajtu by mala byť viditeľná. Pri deduplikácii mien zadaných človekom môže mať zmysel zdokumentovaná politika normalizácie textu pred hashovaním, hoci názvy majú aj problémy s veľkosťou písmen a jazykom, ktoré jeden formulár Unicode nerieši. Pri heslách a autentifikácii sa normalizácia a hašovanie hesiel riadi špeciálnymi bezpečnostnými návrhmi; obyčajné heslo SHA-256 nie je dostatočné úložisko. Uveďte, či je cieľom bajtová identita, ekvivalencia normalizovaného textu alebo ľudská podobnosť. Sú to rôzne prísľuby a žiadny konvertor nemôže vyvodiť zamýšľaný len zo vzhľadu.
Pred zavedením pravidla pre normalizáciu napíšte dva testy: rovnaký viditeľný text v zloženej a rozloženej podobe a zámerne odlišný text. Prvý test má po zvolenej normalizácii viesť k rovnakým bajtom; druhý sa nesmie nečakane zlúčiť. Takto skontrolujete presný účel pravidla, nielen to, že hashovacia funkcia vráti nejaký výsledok. Zmeny pravidla treba verziovať spolu s uloženými dátami.