Vygenerujte hash z řetězce v Javascriptu s příklady

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ů.