Crisimus
This is an attempt at a deterministic password manager. It is only as secure as your master password but gives you the option to create a unique password per site, per username with different levels of complexitity to match website requirements.
All code is open sourced under the MIT license, so feel free to send pull request or make a copy and use for yourself.
Goal of Crisimus
Crisimus started out as a fun little weekend project with the goal of trying to create a deterministic password manager. The goal was to allow one master password to be able to create individual passwords based on email / username and domain. The idea being if one site is breached, all your passwords aren't forgone. You only have to remember one password and you don't have to deal with a password manager.
Schemas
Of course as we all know, each site requires different password requirements. This means that we have to be able to create different schemas for each "type" of allowed passwords. You can view the current schemas here: https://github.com/Prefinem/crisimus/tree/master/packages/crisimus-core/src/schemas
My hope is that if this project proves useful, schemas can be added for each site so that it's less work for the user. (select a site, and type your email / username and master password)
Rules
Rules are how we verify a password meets the minimum security requirement for each schema. For example, Complex 16 requires 2 lower case letters, 2 uppper case letters, 2 numbers and 2 special characters. If the generated password fails to meet all those, then we increment a counter, recalculate the hash based with the counter, and try again. We do limit the retrys to 100 right now as it is still in testing, so if you run into any issues, please raise a github issue.
Demo Site
Use at your own risk. Code is located here: https://github.com/Prefinem/crisimus/tree/master/packages/crisimus-react Hosted on AWS behind CloudFront on S3. No information is stored or transmitted to any server. "Save Info Locally" saves data to your browser's localStroage.
Get Started
Cli
npm install crisimus-cli -g
cr password domain username
Output -
16 Complex Yw=-WGsac6>6UyIu Requires 2 lowercase letter, 2 uppercase letter, 2 numbers and 2 specials chars (.!@<>;:[]{}|-_=+). Length of 16
16 Less Complex -I_eeLqQ_78qjxcu Requires 2 lowercase letter, 2 uppercase letter, 2 numbers and 2 specials chars (.!-_=). Length of 16
16 AlphaNumeric 2W2Ge0gA62CoM2Ya Requires 2 lowercase letter, 2 uppercase letter and 2 numbers. Length of 16
12 Complex YWS0A6Yk>]eE Requires 2 lowercase letter, 2 uppercase letter, 2 numbers and 2 specials chars (.!@<>;:[]{}|-_=+). Length of 12
12 Less Complex MbPdzM!c72O_ Requires 2 lowercase letter, 2 uppercase letter, 2 numbers and 2 specials chars (.!-_=). Length of 12
12 AlphaNumeric W82uogYsqKiK Requires 2 lowercase letter, 2 uppercase letter and 2 numbers. Length of 12
Integration
npm install crisimus-core
example.js -
let schemaWithPasswords;
const crisimus = require('./src/index.js');
const keys = ['domain', 'master password', 'username'];
const obj = {
domain: 'domain',
master: 'master password',
username: 'username'
};
schemaWithPasswords = crisimus(...keys);
schemaWithPasswords = crisimus(obj);
schemaWithPasswords = crisimus('domain', 'master password', 'username');
console.log(schemaWithPasswords);
Output
[
{
"description": "Requires 2 lowercase letter, 2 uppercase letter, 2 numbers and 2 specials chars (.!@<>;:[]{}|-_=+). Length of 16",
"name": "16 Complex",
"value": "@I@e8y8MIe>-8=Sa"
},
{
"description": "Requires 2 lowercase letter, 2 uppercase letter, 2 numbers and 2 specials chars (.!-_=). Length of 16",
"name": "16 Less Complex",
"value": "Fpj2rYR.0sR.-Y!5"
},
{
"description": "Requires 2 lowercase letter, 2 uppercase letter and 2 numbers. Length of 16",
"name": "16 AlphaNumeric",
"value": "QK20SYWkYeMGkQKy"
},
{
"description": "Requires 2 lowercase letter, 2 uppercase letter, 2 numbers and 2 specials chars (.!@<>;:[]{}|-_=+). Length of 12",
"name": "12 Complex",
"value": "iKe.cSOk-8=2"
},
{
"description": "Requires 2 lowercase letter, 2 uppercase letter, 2 numbers and 2 specials chars (.!-_=). Length of 12",
"name": "12 Less Complex",
"value": "4E=fFkhCB.V9"
},
{
"description": "Requires 2 lowercase letter, 2 uppercase letter and 2 numbers. Length of 12",
"name": "12 AlphaNumeric",
"value": "Ss6kgUAmAIs6"
}
]
Notes
If you use the crisimus or crisimus-core package in your own javascript code and give it an object, please do note that we always sort the keys by key name to ensure the same output.