KdbxWeb is a high-performance javascript library for reading/writing KeePass v2 databases (kdbx) in node.js or browser.
- runs in browser or node.js
- no native addons
- average file open time is 200ms
- total ≈150kB with dependencies
- full support of Kdbx features
- protected values are stored in memory XOR'ed
- modern browsers: IE10+, Firefox, Chrome, Safari 7+, Opera
- node.js
var credentials = new kdbxweb.Credentials(kdbxweb.ProtectedValue.fromString('demo'), keyFileArrayBuffer);
var db = kdbxweb.Kdbx.load(data, credentials);
var dataAsArrayBuffer = db.save();
var xmlAsString = db.saveXml();
Header object fields
Meta object fields
db.meta
db.header
var db = kdbxweb.Kdbx.load(data, credentials);
db.credentials.setPassword(kdbxweb.ProtectedValue.fromString('newPass'));
var randomKeyFile = kdbxweb.Credentials.createRandomKeyFile();
db.credentials.setKeyFile(randomKeyFile);
db.save();
var newDb = kdbxweb.Kdbx.create(credentials, 'My new db');
var group = newDb.createGroup(newDb.getDefaultGroup(), 'subgroup');
var entry = newDb.createEntry(group);
var defaultGroup = db.getDefaultGroup();
var anotherGroup = db.getGroup(uuid);
var deepGroup = defaultGroup.groups[1].groups[2];
var group = db.createGroup(db.getDefaultGroup(), 'New group');
var anotherGroup = db.createGroup(group, 'Subgroup');
db.remove(group, parentGroup);
db.remove(group, parentGroup, toGroup);
var recycleBin = db.getGroup(db.meta.recycleBinUuid);
if (!recycleBin) {
db.createRecycleBin();
}
Entry object fields
Entry.times fields
var entry = db.getDefaultGroup().entries[0];
entry.fields.AccountNumber = '1234 5678';
entry.fields.Pin = kdbxweb.ProtectedValue.fromString('4321');
var entry = db.createEntry(group);
// push current state to history stack
entry.pushHistory();
// change something
entry.fgColor = '#ff0000';
// update entry modification and access time
entry.times.update();
db.remove(entry, parentGroup);
db.remove(entry, parentGroup, toGroup);
Used for passwords and custom fields, stored the value in memory XOR'ed
var value = new kdbxweb.ProtectedValue(xoredByted, saltBytes);
var valueFromString = kdbxweb.ProtectedValue.fromString('str');
var valueFromBinary = kdbxweb.ProtectedValue.fromBinary(data);
var textString = value.getText();
var binaryData = value.getBinary();
var includesSubString = value.includes('foo');
try {
kdbxweb.Kdbx.load(data, credentials);
} catch (e) {
if (e.code === kdbxweb.Consts.ErrorCodes.BadSignature) { /* ... */ }
}
kdbxweb.Consts.ErrorCodes (all thrown errors have code property)
kdbxweb.Consts.Defaults // default db settings
kdbxweb.Consts.Icons // icons map
var randomArray = kdbxweb.Random.getBytes(/* desired length */ 100);
kdbxweb.ByteUtils.bytesToString(bytes);
kdbxweb.ByteUtils.stringToBytes(str);
kdbxweb.ByteUtils.bytesToBase64(bytes)
kdbxweb.ByteUtils.base64ToBytes(str);;
Use npm to build this project:
> npm run build
> npm run build:debug
To run tests:
> npm test
Areas which need more attention for now:
- unit tests, especially for complex functions (like moving entry with binaries)
- testing in general
- better documentation
- merge files support
MIT