vvo / iron-store

🧿 in-memory, signed and encrypted JavaScript store

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

iron-store GitHub license Tests codecov npm

🧿 in-memory, signed and encrypted JavaScript store

UPDATE FROM MAINTAINER: You can now use https://github.com/vvo/iron-session/ directly and its methods sealData unsealData which will provide the same functionnality than iron-store.


This is a low-level module that you can use to implement signed and encrypted sessions using cookies for example, like next-iron-session does.

Signature and encryption is based on @hapi/iron.

Use https://1password.com/password-generator/ to generate strong passwords.

You can use multiple passwords (password rotation).

npm add iron-store

Examples

Creating a store with sealed data (encrypt):

import ironStore from "iron-store";

const store = await ironStore({
  password: "generated_complex_password_at_least_32_characters_long",
});
store.set("user", { id: 80, admin: true });
const seal = await store.seal();
//

Creating a store from previously sealed data (decrypt):

import ironStore from "iron-store";

const store = await ironStore({
  password: "generated_complex_password_at_least_32_characters_long",
  sealed: "seal_obtained_from_previous_store.seal()_call",
});
const user = store.get("user");
console.log(user);
// { id:80, admin:true }

Creating a store using multiple passwords (password rotation):

You can implement password rotation by providing an array of passwords and ids. The id can be a string (letters, numbers and _) or just a number.

The first password in the array is always the one used to seal data. All the other passwords are used to decrypt data.

Note: The id is mandatory and part of the seal, so that we can know in advance which password to use when decrypting. You need to use unique ids. You cannot reuse a id for a different password.

Note: If you started to use the string form of password, you can always move to an array of password objects. The string form of your password is internally handled as { id: 1, password }.

import ironStore from "iron-store";

const store = await ironStore({
  password: [
    {
      id: 2,
      password: "generated_complex_password_at_least_32_characters_long",
    },
    {
      id: 1,
      password: "generated_complex_password_at_least_32_characters_long",
    },
  ],
});
store.set("user", { id: 80, admin: true });
const seal = await store.seal();

API

ironStore({ [sealed], password, ttl = 0 })

store.set(name, value)

store.get([name])

store.setFlash(name, value)

store.unset(name)

store.seal()

store.clear()

About

🧿 in-memory, signed and encrypted JavaScript store

License:MIT License


Languages

Language:JavaScript 100.0%