JavaScript 中的 SHA-256 實現

Mehvish Ashiq 2023年1月30日 2022年5月10日
  1. 什麼是 JavaScript 中的雜湊
  2. 什麼是 JavaScript 中的 SHA-256 演算法
  3. JavaScript 中的 SHA-256 實現
  4. 在 JavaScript 中使用加密庫實現 SHA-256
  5. 在 JavaScript 中使用 node-forge 模組實現 SHA-256
JavaScript 中的 SHA-256 實現

可以生成各種雜湊,例如 MD5SHA-1SHA-2SHA-256 等。本文重點介紹 JavaScript 中的 SHA-256 實現。

在此之前,最好對雜湊和 SHA-256 演算法有一個基本的瞭解。開始吧!

什麼是 JavaScript 中的雜湊

雜湊是一個將指定的字串或鍵轉換為無法轉換回其真實形式的其他值的過程。雜湊函式轉換對給定輸入(字串)執行一些數學運算的純文字。

雜湊函式產生的輸出稱為摘要雜湊值

javascript 中的 sha-256 實現 - 什麼是雜湊

什麼是 JavaScript 中的 SHA-256 演算法

SHA 代表 Secure Hash Algorithm,它來自 SHA-2 演算法家族。SHA-256 中的 256 是什麼意思?

這意味著無論純文字的大小如何,最終的雜湊值都將始終為 256 位。SHA-256 也類似於其他 SHA 演算法。

讓我們開始用 JavaScript 實現 SHA-256

JavaScript 中的 SHA-256 實現

我們將學習在 JavaScript 中實現 SHA-256 的不同方法,你可以根據專案需要使用這些方法。但在此之前,讓我們瞭解如何使用 String 的函式生成雜湊。

下面給出示例程式碼以供練習。

// conversts to 32bit integer
function stringToHashConversion(string) {
 var hashVal = 0;
 if (string.length == 0) return hashVal;
 for (i = 0; i < string.length; i++) {
 char = string.charCodeAt(i);
 hashVal = ((hashVal << 5) - hashVal) + char;
 hashVal = hashVal & hashVal;
    }
 return hashVal;
  }
var input_str = "I am converting string to hash.";
console.log("Input String: "+input_str);
console.log("Hash Value: " + stringToHashConversion(input_str));

輸出:

"Input String: I am converting string to hash."
"Hash Value: 625005622"

函式 stringToHashConversion() 為空字串返回零 (0)。它迭代直到 string.length-1 獲得每個字元的 charCode 並通過向左移動 5 位來計算雜湊。

最終的雜湊值是一個 32 位整數。

現在,要關注的重點是 5 位左移。為什麼是 5,而不是 6 或 4?這是因為 (hashVal << 5)(hashVal * 32) 相同。

這樣,((hashVal << 5) - hashVal) 等價於 (hashVal * 31)。如果我們將 ((hashVal << 5) - hashVal) 替換為 (hashVal * 31),我們會得到相同的雜湊值。

你還在為 31 這個數字而困惑嗎?

選擇 31 是因為它是奇數素數之一。想象一下,如果這是一個偶數並且乘法溢位,所有細節都會消失,因為乘以 2 與移位相同。

那為什麼不使用 (hashVal * 31)?這是因為,(hashVal << 5) - hashVal(hashVal * 31) 快。

我們還可以通過使用 ES6 Math.imul 來使用更快的版本,它有助於計算指定兩個值的 32 位整數乘法(參見以下程式碼)。

| 0 優化 hash 以獲得更好的速度,並在以下解決方案中將其強制為 32 位數字。

JavaScript 程式碼:

function stringToHashConversion(string) {
 for(var i = 0, hash = 0; i < string.length; i++)
 hash = Math.imul(31, hash) + string.charCodeAt(i) | 0;
 return hash;
}
var input_str = "I am converting string to hash.";
console.log("Input String: "+input_str);
console.log("Hash Value: " + stringToHashConversion(input_str));

輸出:

"Input String: I am converting string to hash."
"Hash Value: 625005622"

在 JavaScript 中使用加密庫實現 SHA-256

讓我們使用 Crypto 庫來實現 SHA-256。使用 require() 方法匯入 crypto 模組。

getHashes() 返回所有支援的演算法名稱。我們使用 createHash() 建立 Hash 物件,它接受兩個引數,演算法的名稱和選項。

第二個引數是可選的。此外,我們使用此 Hash 物件使用指定的演算法生成雜湊摘要。

update() 方法更新資料,digest() 告訴使用的編碼。digest 是雜湊函式產生的結果,這個結果只有十六進位制值。

你可以在這裡讀更多關於它的內容]。你必須有 Node.js 才能使用 Crypto 庫。

JavaScript 程式碼:

const crypto = require('crypto'),
hash = crypto.getHashes();
var input_str = "I am converting string to hash.";

hashPwd = crypto.createHash('sha256')
    .update(input_str)
    .digest('hex');

console.log("Input String: "+input_str);
console.log("Hash Value: " + hashPwd);

輸出:

Input String: I am converting string to hash.
Hash Value: ceb443790638fbc0f543ccf80a08085a731c83a6fd1843c3c3ff2e6edd86c58b

在 JavaScript 中使用 node-forge 模組實現 SHA-256

我們可以使用以下命令在 Node.js 中安裝 node-forge 模組,然後使用它。

npm install node-forge

Forge 是 TLS(傳輸層安全)和 JS (JavaScript) 中不同加密工具的本地實現。首先,我們使用 require() 匯入模組,然後通過呼叫 create() 函式建立一個為 SHA-256 初始化的 forge 物件。

update() 更新資料,而 digest() 函式執行雜湊並返回給定文字的雜湊值。請參閱以下程式碼。

var forge = require('node-forge');
var input_str = "I am converting string to hash.";
var md = forge.md.sha256.create();
md.update(input_str);
console.log("Input String: "+ input_str);
console.log("Hash Value: " + md.digest().toHex());

輸出:

Input String: I am converting string to hash.
Hash Value: ceb443790638fbc0f543ccf80a08085a731c83a6fd1843c3c3ff2e6edd86c58b
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook