This project is still under development, getting stable but will probably keep changing during the course of its evolution.
ItchyPassword is a web-based password manager, that should be usable for anyone.
It works fully offline with all the cryptography happening in the browser. It requires a browser with SubtleCrypto API available.
Works fine with Chromium-based browsers (Edge, Chrome) and Firefox on desktop (Windows 10 and 11) and mobile (Chrome and Edge on Android).
There is the possibility to plug vault storages to automatically fetch and store data from/to external services, so this will require an internet access, but it is optional and those actions (fetch/store) can be performed manually instead.
In any case, your master key never leaves the machine and is never stored anywhere, neither in clear nor even encrypted. Never. Meaning you have to enter it each time you start the application or refresh the page. This is by design.
You can find a usable version of the application here.
You need to have NPM installed to fetch packages, and optionally NVM to help you select the right version of NPM if you have many installed.
This project doesn't use NodeJS at all.
Tested with NPM versions:
- 6.0.0
- 6.13.0
- 7.24.0
- 8.19.2
cd web
nvm use
npm install
npm run build # or npm run watch, or npm run build-devThe npm run commands:
watchwill compile the TypeScript code and watch it, rebuilding incrementally when it changes.buildwill build the code in production mode.build-devwill build the code in development mode.
Open docs/index.html in your browser.
You do not need to make the files served by a web server, just open the file with your preferred browser and it will work.
First, let me give you an overview of ItchyPassword.
When you run it, it should look like this:
The Master key field is where you enter your master key, which is the only "password" you should ever have to remember.
The green field below is just a convenience field for you to retype your master key, if it turns green, it means both fields match, if it turns red, they don't, as simple as that.
This is useful when you work fully offline and when you create your very first passwords or ciphers, you need to make extra sure they are not generated with the wrong master key.
The button Protect and lock removes your master key from the UI text element and stores it in memory. This is to avoid a person with physical access to your machine to be able to copy and paste it somewhere readable.
Note The master key should be quite long and unpredictable. For this purpose, I recommend to use Dicewareâ„¢
You can find a web-based implementation at https://tanukisharp.github.io/Diceware/ (details)
This tab is just here if you want to hide content, if you have visitors or what.
This is where you can generate passwords.
This is where you can encrypt and decrypt any text content. (it should be named Cipher actually)
This tab is named ... to keep it short and avoid taking too much space in the UI, because it is almost never used, is experimental, and probably buggy. Let's skip it for now.
This tab is supposed to show errors when they occur, in order to debug issues when a developer console is not accessible (thank you mobile browsers), but so far it's not working great. 🫤 Let's skip it too.
This is where you will be able to load and save information about your passwords and ciphers. This tab will require an internet access, but all sensitive data is encrypted with your master key.
For now, only GitHub storage is supported, but the application is designed to be extended with other types of vault. To access GitHub, you will need a personal access token. Your GitHub personal access token is stored in the browser's local storage, encrypted with your master key.
More details on the personal access token later.
When the vault is fetched successfully, that means GitHub access was granted, which means your personal access token was successfully decrypted, which means your master key is correct, and so the Master key field is automatically "protected and locked", just as if you had clicked on the Protect and lock button.
- Input your master key in the
Master keyfield. - Go to the
Passwordtab. - Type something in the
Public part. You can also click theGeneratebutton to get a unique public part, if you don't care about remembering it.
Note that as you type, once the public part is long enough, a password is generated in thePasswordfield and it is also copied to the clipboard for you to paste it somewhere later on, if theCopybutton flashed green. If it flashed red, that means something failed. - Copy (if not already done) the password generated in the
Passwordfield and use it anywhere needed.
For a given master key and a given public part, the same password is generated, so if the public part changes, you get a different password, and that's all the point.
Of course if you type a given public part correctly but make a mistake in your master key, you get the wrong password, so watch out.
The public part is something you have to remember if you do not use the vault feature. To be honest, remembering the public part for all the services you use can be quite challenging, so the vault is getting handy, and in this case, because you do not have to remember the public part, you can just generate it with the Generate button.
Warning At least for GitHub, the public part should be something you know and remember.
If you generate a random string, and you push it to your vault, then when you need to setup a new device, you will need your password to access GitHub, and the public part to generate your GitHub password will be in your vault, in GitHub, and you will have locked yourself out.
- Input your master key in the
Master keyfield. - Go to the
Cipherstab. - Type a cipher name in the
Cypher namefield. This is just for you to understand what cipher it is, and is only relevant when you store your cipher in the vault. - Type what you want to encrypt or decrypt in the box below on the left, and click either the
EncryptorDecryptbutton for your clear text to be encrypted in the box on the right, or your encrypted text to be decrypted and appear in the box on the right.
For the moment, ItchyPassword has only one vault storage implementation, and it is based on GitHub repository, meaning that your data is stored in a JSON file in a GitHub repository, and pushing changes is actually making commits to the repository, so your data is also versioned and can be reverted in case of problem.
So first, you will need a GitHub account.
You can create an account very quickly and for free if you don't already have one. Just go to https://github.com and sign up.
By the way, if you are just about to sign up, I recommend you to already use ItchyPassword to create your GitHub password.
Quick summary if you didn't read the sections above:
- Open https://tanukisharp.github.io/ItchyPassword/ in a web browser.
- In the
Master keyfield, type your master key. - In the
Passwordtab, type a public part. I recommendgithub.com/<your-email-address>, but anything long enough and that you will always remember for sure will do. - Copy the resulting password in the
Passwordfield in order to use it. (ItchyPassword does it for you though)
Here I assume you know how to use GitHub, teaching you that is beyond the scope of this document.
Once you have a GitHub account and you are logged in, create a repository that will be used to store your data. By convention, name it ItchyPasswordVault, but you are really free to name it as you please.
- Open https://tanukisharp.github.io/ItchyPassword/ in a web browser.
- Enter your master key in the
Master keyfield. - Go to the
Vaulttab - Click the
Refreshbutton. This will trigger the setup procedure since it is not setup yet. - A dialog should open asking you for a username:
Enter the username you used to create your GitHub account. Note that this is not your email address. - In the next dialog, you are asked to enter a GitHub repository name:
Enter the name of the repository you created to store your vault data. The field is pre-filled with the value ItchyPasswordVault, but you have to enter the name of the repository you created. - In the next dialog, you are asked to type the name of your vault file:
You can name the file that will store your data the way you want. By default the value vault.jsonis pre-filled, but again, this is a free field. - In the next (and last) dialog, you are asked to enter a
Personal access token:
Note: I detail the procedure to generate a personal access token in the section Generate a personal access token (on GitHub)below.
This token is for GitHub to grant you access to theItchyPasswordVaultrepository. This is required to fetch the data file from GitHub, and also to push changes to the data file back to GitHub. - Once you have a personal access token, it is encrypted with your master key and stored in the browser's local storage. That's why you needed to enter your master key first, at step 2.
Anyway, if you click theRefreshbutton of theVaulttab without having a master key entered first, ItchyPassword tells you that you must enter a master key first, to make sure you can't accidentally paste a personal access token that would not be persisted, or even worst, persisted in clear. 😱
Once the procedure is done, the Refresh button should flash green to indicate that everything went according to plan. Otherwise, the button will flash red to indicate that an error occurred.
In case of failure, you are mostly clueless, unfortunately. The Logs tab is supposed to help, but most of the time, it doesn't, sorry about that. 🫤
In case of success, your browser has an encrypted personal access token in its local storage, meaning that:
- on another browser or in another session of the same browser, you won't have this token
- only your master key can make this token usable (decrypt).
- from now on, you will only need to type your master key and click the
Refreshbutton in order to get your vault loaded
The Password and Ciphers tabs have a Push to vault button. Roughly, when clicking this button that is just below the Storage data text field, everything that is in this field (the Storage data) will be pushed to your vault on GitHub.
Here is an image of the empty Password tab:

Hereafter is an image of a real world password generation:
The Public part is filled with long enough text (must be at least 8 characters). You can see that the Password field has also been filled up by ItchyPassword.
The Storage path describes "where" you want to store the details used to (re-)generate the password. By "where", I mean in which object node, you can see this as directories and sub-directories. You can add (virtually) as many as want.
The alphabet, lenght and public properties are the key ingredients to generate the password, and are what will be needed to re-generate it when ou will need it.
The customKeys property is defined by the Custom keys text field at the bottom of the image. This can be empty, but if not, it must be a valid JSON object text representation. Custom keys is free data for you to remember, they are not encrypted and have no impact in password generation.
A good use case is when a service assigns you a huge ID that you will never remember but need to sign-in, you may want to put it here.
When clicking the Push to vault button, the exact content of the Storage data field will be pushed to GitHub in the form of a commit, and will appear as a "diff" in the vault data file.
The Ciphers feature work mostly the same way as the Password feature.
Hereafter is a real world cipher:
Unlike a password, you may have multiple ciphers in a single node, and therefore you have to give it a name, via the Cipher name field.
Below, the left text field is writable and is where the content you want to encrypt (or decrypt) goes. Then click the Encrypt or Decrypt button, and the result goes into the text field on the right, which is read-only, to make sure you cannot edit it by mistake before pushing to your vault.
The Storage path and Custom keys fields work the same as in the Password feature.
For both Password and Ciphers feature, you may have notice a Matching path gray label just below the Storage path field.
This is for, in case you need to update an existing node, you can confirm you didn't mistake. Also, when you create a new password or cipher, it can be useful to check if you didn't already input an existing path by mistake.
Once your vault is correctly setup and functional, clicking the Refresh button should fetch the vault data file and display it, as follow:
The Clear settings button will erase the local storage, the four values you were asked via dialog boxes when you have setup your vault.
Before clearing the settings, it will ask you for confirmation, so if you click the button by mistake, no worries.
The View settings will just display what's in the local storage, except the personal access token, as follow:
This can be useful to confirm what you entered if something goes wrong.
The Search box allows you to filter elements with a specific text. The fuzzy search mode will find more matches then the exact mode, as follow.
Finally, in the Tree view, you should see buttons appear. A button is created for each password and cipher, alongside an edit cipher button.
Clicking on a password or cipher button will automatically re-generate the password or cipher and copy it to the clipboard, for your convenience.
Clicking on the edit cipher button will open the Ciphers tab and copy the encrypted and decrypted content in the UI.
The procedure described below is correct as of April 2023.
Note that by the time you read it, it may have changed on GitHub side and not updated here.
-
Open https://github.com and log in.
If you are setting up things on a new device:a. Open ItchyPassword.
b. Enter your master key in
Master keyfield.c. Enter your predictable public part for GitHub, such as
github.com/<your-email-address>.d. Login to GitHub with the generated password in the
Passwordfield. -
Once logged-in to GitHub, find the
Settings, thenDeveloper settings, thenPersonal access tokens. -
Here you can choose
Tokens (classic)orFine-grained tokens.
I recommendFine-grained tokens, but the classic will do too. -
Click on the
Generate new tokenbutton. -
On the token creation page, for the field
Token name(orNoteif you choseTokens (classic)), I recommend to name the tokenItchyPassword (<user> / <device-type> / <browser-name>), but again, this field is completely up to you.Warning As of now, the fine-grained token name is limited to 40 characters, which clearly sucks in my opinion. I opened an issue to ask, but nobody gives a damn. https://github.com/orgs/community/discussions/41568
The reason for specifying all this (user, device type and browser), is because:
user: you may at some point need to generate a token for another person, like your childdevice: you may want to know on which device this token is stored, in case you loose it (the device), you know which token to invalidatebrowser: you may use several browsers on the same device, and each will need its own token
Here are some examples with my naming convention:
ItchyPassword (Alice / Living room TV desktop / Edge)ItchyPassword (Bob / Pixel 6a / Chrome)ItchyPassword (Bob / Pixel 6a / Firefox)
-
For the
Expirationfield, you can safely set 90 days, but avoid setting a longer duration.
This means you will have to re-generate a new token every 90 days (3 months), but re-generating is much simpler.Note If you need to generate a token for testing something or because you need to access one of your information only once from another device, I recommend in this case to generate a token with the shortest lifetime possible.
-
For the last setting:
a. If you chose
Tokens (classic), then for the fieldSelect scope, check therepobox, and your screen should look like this:
b. If you chose
Fine-grained tokens, then:- Set a
Descriptionif you want. Can be useful if theToken namefield is too limiting. - Make sure the
Resource owneris set to you (or the right owner) - In the
Repository accesssection, you must selectOnly select repositories, and select only your "ItchyPasswordVault" repository. This is all the point of fine-grained tokens, they can be limited to a given set of repositories. - In the
Permissionssection, unfold theRepository permissionssection, find theContentssub-section and set theAccessdropdown toRead and write.
Your screen should look like this:
Note that Metadatapermission is mandatory and will automatically be set toRead-only. - Set a
-
Finally, click the
Generate tokenbutton.
You should end up on a page with a token that you can copy to the clipboard. This is the personal access token you have to provide to ItchyPassword in theVaulttab.
Input elements are:
- The user's master key (string converted to UTF-8 bytes)
- A public key (string converted to UTF-8 bytes)
- A purpose value (string converted to UTF-8 bytes)
A derived key is computed using PBKDF2 from 1, using 2 as salt, SHA-512 as hash algorithm with 100'000 iterations.
Then, 3 is hashed using HMAC SHA-512 algorithm with 256 bits from the derived key as the secret.
The output of the hash is the final password to be used, which is then encoded using a custom alphabet.
This is the same as version 1 but with 400'000 iterations.












