Tento tutoriál vám ukáže praktický způsob, jak vygenerovat hash pro řetězec v JavaScriptu, a poskytne příklady funkčního kódu, který můžete použít ve svém vlastním projektu.
Co je hash?
Hash nebo kontrolní součet je vypočítaná hodnota s určitou délkou. Předáním hashovacího algoritmu řetězce – který může mít libovolnou délku – se vrátí vypočítaný hash konzistentní délky. Kdykoli je do hashovacího algoritmu předán stejný řetězec, měl by být vrácen stejný vypočítaný hash.
Vzhledem k tomu, že výsledek hashovacího algoritmu by měl být pokaždé stejný, za předpokladu, že je vstup stejný, lze vrácenou hodnotu použít k určení, zda byla původní hodnota změněna nebo ne.
Jedním příkladem použití je při stahování souborů. Stáhne se soubor a stažený soubor, bez ohledu na velikost, může být hašován. Tento hash lze poté porovnat s hashem původního souboru a ověřit, že stahování proběhlo úspěšně a nedošlo k žádnému poškození.
Vzhledem k tomu, že hodnoty hash mají pevnou velikost, která je menší než stažený soubor, není nutné soubor znovu stahovat, aby byl ověřen – je třeba znát pouze mnohem kratší hodnotu hash.
P>Použití v JavaScriptu
To je v JavaScriptu užitečné právě pro tento účel – ověření přenesených dat. Pokud je hash znám pro velký kus dat, lze jej ověřit.
Bezpečné hashovací algoritmy
Hašování se často používá v zabezpečení a kryptografii, zejména hašování, které je obtížné zvrátit. Hashe používané pro kryptografii lze také použít pro jiné účely, jako je příklad ověření stahování popsaný výše.
Generování hash v JavaScriptu
SubtleCrypto je nedávný přírůstek do JavaScriptu, který lze použít ke generování bezpečných hodnot hash.
Mohou být použity ke generování hashů pro jakýkoli účel – nejen pro zabezpečení – což je užitečné, protože je můžeme použít místo vlastního psaní dalšího kódu.
Níže uvedená funkce používá SubtleCrypto ke generování zabezpečeného hash pro daný řetězec:
// Function to generate a hash from a string // The algorithm used can be specified, or will default to SHA-512 function generateHash(str, algorithm = "SHA-512") { // Create an array buffer for the supplied string - this buffer contains an integer representation of the string which can be used to generate the hash let strBuffer = new TextEncoder().encode(str); // use SubtleCrypto to generate the hash using the specified algorithm return crypto.subtle.digest(algorithm, strBuffer) .then(hash => { // The resulting hash is an arrayBuffer, and should be converted to its hexadecimal representation // Initialize the result as an empty string - the hexadecimal characters for the values in the array buffer will be appended to it let result = ''; // The DataView view provides an interface for reading number types from the ArrayBuffer const view = new DataView(hash); // Iterate over each value in the arrayBuffer and append the converted hexadecimal value to the result for (let i = 0; i < hash.byteLength; i += 4) { result += ('00000000' + view.getUint32(i).toString(16)).slice(-8); } return result; }); }
Tato funkce vrací příslib, používá se takto:
generateHash('London Bridge is falling down') .then(hash => { console.log(hash); });
Příslib se vyřeší pomocí hashe pro dodaný řetězec – hash SHA-512 obsahující hexadecimální hodnoty.
Zavedení vlastního ověření?
Pokud k vytvoření vlastního ověřovacího systému používáte vlastní hashovací funkce – ať už jde o hašování hesel pro úložiště, generování ověřovacích kódů nebo cokoliv souvisejícího se zabezpečením… Ne.
Používejte komunitou spravovanou, zavedenou a řádně prověřenou knihovnu nebo službu ke zpracování vašeho ověřování. Nemá cenu udržovat svůj vlastní systém – i jednoduchá chyba by mohla ohrozit vaši aplikaci, vaše systémy nebo soukromé informace vašich uživatelů.