code: function pbkdf2(hashAlg, salt, iterations, size, passphrase) {
  	var hkey = Buffer.alloc(salt.length + 4);
  	salt.copy(hkey);
  
  	var gen = 0, ts = [];
  	var i = 1;
  	while (gen < size) {
  		var t = T(i++);
  		gen += t.length;
  		ts.push(t);
  	}
  	return (Buffer.concat(ts).slice(0, size));
  
  	function T(I) {
  		hkey.writeUInt32BE(I, hkey.length - 4);
  
  		var hmac = crypto.createHmac(hashAlg, passphrase);
  		hmac.update(hkey);
  
  		var Ti = hmac.digest();
  		var Uc = Ti;
  		var c = 1;
  		while (c++ < iterations) {
  			hmac = crypto.createHmac(hashAlg, passphrase);
  			hmac.update(Uc);
  			Uc = hmac.digest();
  			for (var x = 0; x < Ti.length; ++x)
  				Ti[x] ^= Uc[x];
  		}
  		return (Ti);
  	}
  }
docs: /* See: RFC2898