Why BLAKE2 for hashing? Because "BLAKE2 outperforms MD5, SHA-1, SHA-2, and SHA-3 on recent Intel CPUs" and has "no known security issues, whereas SHA-1, MD5, and SHA-512 are susceptible to length-extension". https://blake2.net/
node-blake2 provides a stream-compatible
blake2b, blake2bp, blake2s, and blake2sp Hash and KeyedHash for node 4+.
node-blake2 was tested to work on
- Ubuntu 14.04 (g++ 4.8.2)
- Ubuntu 14.04 (clang++ 3.6.2-svn238746-1~exp1)
- Ubuntu 15.04 (g++ 4.9.2)
- Windows 8.1 x64 (VS2013)
- OS X 10.10 (Apple LLVM 6.1.0)
On Windows, first install Python 2.7.13 so that node-gyp works.
In your project, run:
npm install blake2 --save
or install from the GitHub repo:
npm install ludios/node-blake2 --save
varblake2=require('blake2');varh=blake2.createHash('blake2b');h.update(newBuffer("test"));console.log(h.digest("hex"));blake2.createHash works like node's
crypto.createHash.
varblake2=require('blake2');varh=blake2.createKeyedHash('blake2b',newBuffer('key - up to 64 bytes for blake2b, 32 for blake2s'));h.update(newBuffer("test"));console.log(h.digest("hex"));blake2.createKeyedHash takes a key argument like
crypto.createHmac.
Although it is not an HMAC, a keyed hash serves the same purpose.
blake2.create{Hash,KeyedHash}support algorithmsblake2b,blake2bp,blake2s, andblake2sp.- Data passed to
.updateonblake2.{Hash,KeyedHash}must be aBuffer. - Keys passed to
blake2.createKeyedHash(algo, key)must be aBuffer. - Just as with
crypto.Hash,.digest()can only be called once.
This works exactly like it does with crypto.Hash. See b2sum.js.
BLAKE2 can generate digests between 1-64 bytes for BLAKE2b and 1-32 bytes for
BLAKE2s. Pass digestLength as an option to use a digest shorter than the
default (maximum length):
varblake2=require('blake2');varh=blake2.createHash('blake2b',{digestLength: 16});h.update(newBuffer("test"));h.digest();// Returns a Buffer with 16 bytesor with a key:
varblake2=require('blake2');varh=blake2.createKeyedHash('blake2b',newBuffer('my key'),{digestLength: 16});h.update(newBuffer("test"));h.digest();// Returns a Buffer with 16 bytesNote that BLAKE2 will generate completely different digests for shorter digest lengths; they are not simply a slice of the default digest.
You can call .copy() on a Hash or KeyedHash, which will return a new object with all of the internal BLAKE2 state copied from the source object.
varblake2=require('blake2');varh=blake2.createHash('blake2b');h.update(newBuffer("test"));// Call .copy() before .digest(), because .digest() finalizes internal statevarj=h.copy();// h is unaffected by updates to jj.update(newBuffer("more"));console.log(h.digest());console.log(j.digest());In case you need to continue with a partial hash later on, the .saveState() and .restoreState() methods are for you!
varblake2=require('blake2');varh=blake2.createHash('blake2b');h.update(newBuffer("test"));// Call .saveState() before .digest(), because .digest() finalizes internal statevarstate=h.saveState();h.update(newBuffer("more"));console.log(h.digest());// Much, MUCH later, in another process in another galaxyvarj=blake2.createHash('blake2b');j.restoreState(state);// h is unaffected by updates to jj.update(newBuffer("more"));// This will be the same as h.digest()console.log(j.digest());- On Windows, node-blake2 requires AVX instructions due to some SSE2 build problems. This shouldn't be too hard to fix.