Hash function也可稱為雜湊函式,可以把一串任意長度大小的字串或數字,轉換一串為固定大小的值。
而任何相同的值經過hash後出來的值都會是相同的,所以就可以進一步做到訊息驗證。
通常是一個單向函式,也就是無法從算出來的值反推回原本的值 ( 除了已經被破解的Hash算法例外 )。
比較常見的包含MD5、SHA1、SHA2、SHA3與Ripemd系列等等,但目前MD5與SHA1已經被破解。
而還有一些是專門用來幫密碼做Hash的雜湊函式,例如:
bcrypt、PBKDF2、scrypt、Argon2等等。
雜湊函式被設計成能夠非常快速,讓整個加密程序不至於被拖慢,但這樣攻擊者可以非常快速的用任意的字串來進行雜湊並比對輸出結果,所以在雜湊中會加入一些方法來解決此問題。
1.Salt
Salt是指在雜湊函數中或是密碼上加入一串隨機的位元 ( random sequence of bytes )。
所以密碼就會像是:salt字串 + password字串
而任何人知道 password 字串並進行雜湊後的雜湊值,將不會與加入salt後的值相同。
如果每個使用者都有不同的salt,就沒有簡單的方法來辨識出使用者是否使用相同的password字串。
2.Stretching
意思就是讓我們雜湊過的數字再次進行雜湊,所以要得到相同的Hash的話對方必須也要進行相同次數的雜湊才可以。
3.Memory
在計算時將大量數字暫存在記憶體中,如此一來電腦在運算時也必須消耗足夠的記憶體,
使用大量的記憶體也代表了這個雜湊函式不容易進行平行處理(parallelize)。
我們下面一樣使用Node.js來展示一些Hash function讓大家可以快速地了解他們的用法。
const crypto = require('crypto');
function md5(text) {
return crypto.createHash('md5').update(text).digest('hex');
};
let hash = md5('test');
console.log(hash);
全名為 Secure Hash Algorithm,從1995年發佈的SHA1、2001年發佈的SHA2、2015年正式發佈的SHA3,每一代都是上一代的改進版本,而SHA1的Hash值長度為160bits,到了SHA2與SHA3他們的長度可以是以下幾種,例如:224、256、384、512等等,所以我們才會常聽到例如SHA-256或是SHA-512等等的名詞。
SHA-256範例:
const crypto = require('crypto');
let hash = crypto.createHash('sha256').update('test').digest('hex'); //hex代表輸出為16進位,原先為buffer型態
console.log(hash);
而在2015年8月5日SHA-3正式發表,而由於原先的Keccak被選為SHA3的最適合算法,所以SHA3也稱為Keccak
以下為Node.js SHA3範例:
npm install [email protected]
const SHA3 = require('sha3');
let hash_512 = new SHA3.SHA3Hash().update('test').digest('hex'); //預設為512bits
console.log(hash_512);
let hash_224 = new SHA3.SHA3Hash(224).update('test').digest('hex'); // 224 bits
console.log(hash_224);
Ripemd系列包含128、160、256、320等等,數字代表其 hash 過後的 bits 長度,最常見的是Ripemd-160,也就是產生160 bits長度的Hash,而Ripemd主要為了加強與改良原先的MD系列而發明。
Ripemd-160範例:
需要先安裝 ripemd160 第三方模組
npm install [email protected]
const RIPEMD160 = require('ripemd160')
console.log(new RIPEMD160().update('test').digest('hex'))
HMAC是在上述的雜湊函式外再加上一個secret,然後一起進行Hash。
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'a secret');
hmac.update('test');
console.log(hmac.digest('hex'));
這是一個強調快速、安全與簡單的Hash算法,並且目前被用來替代MD5和SHA1。
因為它可以在不耗費更多資源的情況下提供更好的安全性,但後來由Keccak獲選為SHA3的原因是NIST認為Keccak更具有抗ASIC的能力以及因為Blake的實作類似於SHA2,所以後來才不選擇Blake為SHA3標準。
參考此:https://crypto.stackexchange.com/questions/31674/what-advantages-does-keccak-sha-3-have-over-blake2
Blake2在2012年發表,是Blake的改良版本,列於RFC-7693 https://tools.ietf.org/html/rfc7693
其中分為兩種類型,BLAKE2b是針對64bits的平台進行優化而BLAKE2s是針對8到32bits的平台。
接著我們使用https://github.com/dcposch/blakejs模組
npm install [email protected]
const blake = require('blakejs')
// blake2b
console.log(blake.blake2bHex('test'))
// blake2s
console.log(blake.blake2sHex('test'))