Skip to content

Commit

Permalink
Merge pull request #73 from dchest/csprng
Browse files Browse the repository at this point in the history
Use CSPRNG to generate objectIds
  • Loading branch information
gfosco committed Feb 1, 2016
2 parents bce6244 + c13b61f commit 251ec4d
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions RestWrite.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// that writes to the database.
// This could be either a "create" or an "update".

var crypto = require('crypto');
var deepcopy = require('deepcopy');
var rack = require('hat').rack();

Expand Down Expand Up @@ -701,15 +702,18 @@ RestWrite.prototype.objectId = function() {
return this.data.objectId || this.query.objectId;
};

// Returns a string that's usable as an object id.
// Probably unique. Good enough? Probably!
// Returns a unique string that's usable as an object id.
function newObjectId() {
var chars = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
'abcdefghijklmnopqrstuvwxyz' +
'0123456789');
var objectId = '';
for (var i = 0; i < 10; ++i) {
objectId += chars[Math.floor(Math.random() * chars.length)];
var bytes = crypto.randomBytes(10);
for (var i = 0; i < bytes.length; ++i) {
// Note: there is a slight modulo bias, because chars length
// of 62 doesn't divide the number of all bytes (256) evenly.
// It is acceptable for our purposes.
objectId += chars[bytes.readUInt8(i) % chars.length];
}
return objectId;
}
Expand Down

0 comments on commit 251ec4d

Please sign in to comment.