A Deterministic Password Manager
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
packages
.eslintrc.js
.gitignore
LICENSE.md
README.md
package.json
yarn.lock

README.md

Crisimus

npm package

version issues dependencies devDependencies downloads

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 a 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

https://crisimus.com/

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('crisimus-core');
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.