1 概述
jsSHA是一個用JS+TS實現完整SHA系列加密算法的加密庫,包括:
SHA1SHA-224/256/384/512SHA3-224/256/384/512SHAKE128/256cSHAKE128/256KMAC128/256
官方Github戳這里,目前已有2k的star,這里是一些使用加密算法的例子。
2 安裝並引入
安裝使用npm或cnpm:
npm install --save jssha
# 或
cnpm install --save jssha
引入時,根據package.json中的type進行相應引入:
const jsSHA = require("jssha") //commonjs
import jsSHA from "jssha" //module
若為
"type":"commonjs"
則使用
const jsSHA = require("jssha")
3 哈希
一個簡單的例子如下:
const jsSHA = require("jssha")
const shaObj = new jsSHA("SHA-512","TEXT",{encoding:"UTF8"})
shaObj.update("test")
console.log(shaObj.getHash("HEX"))
首先聲明了一個shaObj,通過update傳遞明文,並通過getHash("HEX")即得到哈希值,另外update可以調用多次,最后使用getHash即可。
jsSHA()有三個參數:哈希算法、輸入格式以及參數設置(可選)。
3.1 哈希算法
第一個參數是哈希算法,支持的算法如下:
SHA-1SHA-224SHA-256SHA-384SHA-512SHA3-224SHA3-256SHA3-384SHA3-512SHAKE128SHAKE256
目前不建議使用SHA-1,建議使用SHA-2(SHA-224、256/384/512)或SHA-3(SHA3-224/256/384/512)。
而SHAKE是Secure Hash Algorithm and KECCAK的縮寫,在FISP 202標准中定義,與SHA-3類似,但是輸出是無限位數的。因此定義的時候需要指定輸出的位數,不然的話會得到如下報錯:

在getHash中加上參數即可:
const jsSHA = require("jssha")
const shaObj = new jsSHA("SHAKE128","TEXT",{encoding:"UTF8"})
shaObj.update("test")
console.log(shaObj.getHash("HEX",{outputLen:1024}))
3.2 輸入格式
輸入格式的取值如下:
HEXTEXTB64BYTESARRAYBUFFERUNIT8ARRAY
3.3 參數選項
一般常用兩個:
encoding:編碼,允許取值UTF8/UTF16BE/UTF16LEnumRounds:哈希輪數
其他的參數可以查看源碼。
3.4 getHash
getHash是獲取哈希結果的函數,第一個參數可以是:
HEXB64BYTESUINT8ARRAYARRAYBUFFER
與上面的輸入格式對應,可以帶上輸出長度選項,對於HEX可以帶上outputUpper表示是否大寫:

4 HMAC
HMAC是一種基於哈希函數和密鑰進行消息認證的方法,使用時需要指定密鑰:
const jsSHA = require("jssha")
const shaObj = new jsSHA("SHA3-512","TEXT",{
hmacKey:{value:'secret key',format:'TEXT'}
})
shaObj.update("test")
console.log(shaObj.getHash("HEX"))
5 cSHAKE
cSHAKE可以看作一個"定制版"的SHAKE,需要使用額外的customization參數:
const jsSHA = require("jssha")
const shaObj = new jsSHA("CSHAKE128","TEXT",{
customization:{value:"test",format:"TEXT"}
})
shaObj.update("test")
console.log(shaObj.getHash("HEX",{outputLen:1024}))
6 KMAC
KMAC(KECCAK Message Authentication Code)是一個基於KECCAK的算法,需要提供 kmacKey`參數:
const jsSHA = require("jssha")
const shaObj = new jsSHA("KMAC128","TEXT",{
kmacKey:{value:"secret key",format:"TEXT"}
})
shaObj.update("test")
console.log(shaObj.getHash("HEX",{outputLen:1024}))
