Skip to content

Instantly share code, notes, and snippets.

@krmgns
Last active February 8, 2021 23:30
Show Gist options
  • Save krmgns/712ae3610de59cdd9fb1bd46196419f3 to your computer and use it in GitHub Desktop.
Save krmgns/712ae3610de59cdd9fb1bd46196419f3 to your computer and use it in GitHub Desktop.
Generate randomized Salts & GUIDs.
const crypto = require('crypto');
const util = require('util');
const Salt = {
/**
* Length.
* @const int
*/
LENGTH: 128,
/**
* Characters.
* @const string
*/
CHARACTERS: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/',
/**
* Generate.
* @param {Int} length?
* @param {Int} bitsPerChar?
* @return {String}
* @see https://github.com/php/php-src/blob/master/ext/session/session.c#L267,#L326
*/
generate: function(length, bitsPerChar)
{
let len = length || this.LENGTH; // output length
let bpc = bitsPerChar || 6; // 4=hex chars, 5=base36 chars, 6=base64 chars
let bytes = crypto.randomBytes(parseInt(Math.ceil(len * bpc / 8)));
let p = 0, q = bytes.length;
let w = 0, have = 0, mask = (1 << bpc) - 1, byte;
let out = '';
while (len--) {
if (have < bpc) {
if (p < q) {
byte = bytes[p++];
w |= (byte << have);
have += 8;
} else {
break;
}
}
// consume bpc bits
out += this.CHARACTERS[w & mask];
w >>= bpc;
have -= bpc;
}
return out;
}
};
const Guid = {
/**
* Generate.
* @return {String}
*/
generate: function ()
{
let list = new Array(8).fill().map(() => this.random());
return util.format('%s%s-%s-%s-%s-%s%s%s', ...list);
},
/**
* Generate (in old way).
* @return {String}
*/
generateOld: function ()
{
let size = 8;
let list = new Array(size);
while (size) list[--size] = this.random();
return list[0] + list[1]
+ '-' + list[2] + '-' + list[3] + '-' + list[4]
+ '-' + list[5] + list[6] + list[7];
},
/**
* Make 4-length xdigits randomly.
* @return {String}
* @internal
*/
random: function ()
{
return Math.random().toString(16).slice(-4);
}
};
module.exports = Salt;
module.exports = Guid;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment