JavaScript >> Javascript 文檔 >  >> Tags >> string

在Javascript中從字符串生成哈希,帶有示例

本教程將向您展示在 JavaScript 中為字符串生成哈希的實用方法,並提供可在您自己的項目中使用的工作代碼示例。

什麼是哈希?

哈希或校驗和是具有特定長度的計算值。通過向哈希算法傳遞一個字符串(可以是任意長度),將返回一個計算得到的具有一致長度的哈希值。每當將相同的字符串傳遞給哈希算法時,都應返回相同的計算哈希值。

由於每次哈希算法的結果都應該相同,只要輸入相同,就可以通過返回值來判斷原始值是否被修改。

一個例子是文件下載。下載一個文件,下載的文件,無論大小,都可以散列。然後可以將此哈希與原始文件的哈希進行比較,以驗證下載是否成功並且沒有發生損壞。

由於哈希值是固定大小的,比下載的文件小,因此不必重新下載文件即可進行驗證 - 只需知道更短的哈希值。

在 JavaScript 中的使用

這在 JavaScript 中非常有用,僅用於此目的 - 驗證傳輸的數據。如果散列對於大量數據是已知的,則可以進行驗證。

安全哈希算法

散列通常用於安全和密碼學,尤其是難以逆轉的散列。用於加密的哈希也可以用於其他目的,例如上面概述的下載驗證示例。

在 JavaScript 中生成哈希

SubtleCrypto 是最近添加到 JavaScript 中的,可用於生成安全哈希。

它們可用於為任何目的生成哈希——不僅僅是安全——這很方便,因為這意味著我們可以使用它們而不是自己編寫額外的代碼。

以下函數使用 SubtleCrypto 為給定字符串生成安全哈希:

// 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;
        });

}

這個函數返回一個 Promise,它的使用方式如下:

generateHash('London Bridge is falling down')
    .then(hash => {
        console.log(hash);
    });

Promise 使用提供的字符串的哈希值進行解析——一個包含十六進制值的 SHA-512 哈希值。

滾動您自己的身份驗證?

如果您使用自己的哈希函數來構建自己的身份驗證系統——無論是用於存儲的哈希密碼、生成驗證碼還是任何與安全相關的...不要。

使用社區維護、建立並經過適當審查的庫或服務來處理您的身份驗證。維護自己的系統是不值得的——即使是一個簡單的錯誤也可能危及您的應用程序、系統或用戶的私人信息。


Tutorial JavaScript 教程
  1. 一個庫的問題?創造你的!

  2. JavaScript 函數未定義

  3. javascript如何判斷一個數字是否是另一個數字的倍數

  4. 2022 年要構建的 10 個 React 項目 - GitHub

  5. 反應`updateState`

  6. 使用 Nuxt 和 Markdown 構建 Playground

  7. 將原子設計與 Nuxt.js 一起使用,享受一段愉快的 hacking 時光。

  1. 如何在 JavaScript 中查找字符串的 base64

  2. 在 React 中使用 Web 組件

  3. 用於 JS 的 Lodash

  4. TDD 會讓你成為更好的 DEV 嗎?

  5. 為 NativeScript 創建一個離子主題

  6. 具有動態高度的 React Material-Ui 粘性表格標題

  7. 對象解構

  1. 如何使用 Dialogflow 為 Google Assistant 操作實現本地實現

  2. 從 WSL 在瀏覽器中快速打開文件

  3. 2021 年 10 個重要的全棧 Web 開發工具

  4. 如何在菲律賓風格的地圖中隱藏標籤?