websecure-local-storage
Version:
secure localstorage data
85 lines (63 loc) • 2.53 kB
JavaScript
const CryptoJS = require("crypto-js");
const Base64 = require("crypto-js/enc-base64");
const UTF8 = require("crypto-js/enc-utf8");
const CryptSecret = process.env.REACT_APP_CRYPT_LOCAL_STORAGE_SECRET ||
process.env.VUE_APP_CRYPT_LOCAL_STORAGE_SECRET ||
process.env.CRYPT_LOCAL_STORAGE_SECRET;
const secureStorage = () => {
return {
setItem: setItem,
getItem: getItem,
removeItem: removeItem,
clear: clear,
key: key,
length: localStorage.length,
};
};
const crypter = () => ({
encrypt: CryptoJS.AES.encrypt,
decrypt: CryptoJS.AES.decrypt,
keyCrypt: (key) => {
const hashed = CryptoJS.SHA1(`${key}`);
return Base64.stringify(UTF8.parse(hashed));
},
});
const setItem = (key, value) => setItemEncrypted({ key, value }, setFn);
const getItem = (key) => getItemDecrypted({ key }, getFn);
const removeItem = (key) => removeEncrypted({ key }, removeFn);
const clear = () => clearStore(clearFn);
const key = (key) => getKeyName({ key }, keyFn);
const setFn = (key, value) => localStorage.setItem(key, value);
const getFn = (key) => localStorage.getItem(key);
const removeFn = (key) => localStorage.removeItem(key);
const clearFn = () => localStorage.clear(key);
const keyFn = (key) => localStorage.key(key);
const setItemEncrypted = (KeyValuePair, _setKeyValuePairFn) => {
const { key, value } = KeyValuePair;
if (!key || typeof key !== "string") return;
const encryptedKey = crypter().keyCrypt(`${key}`).toString();
if (!CryptSecret) return _setKeyValuePairFn(encryptedKey, `${value}`);
const encryptedValue = crypter().encrypt(`${value}`, CryptSecret).toString();
return _setKeyValuePairFn(encryptedKey, encryptedValue);
};
const getItemDecrypted = (KeyValue, _getKeyValuePairFn) => {
const { key } = KeyValue;
const encryptedKey = crypter().keyCrypt(`${key}`, CryptSecret).toString();
const encryptedValue = _getKeyValuePairFn(encryptedKey);
if (!encryptedValue || !CryptSecret) return encryptedValue;
const decryptedValue = crypter().decrypt(encryptedValue, CryptSecret);
return decryptedValue.toString(CryptoJS.enc.Utf8);
};
const removeEncrypted = (KeyValue, _removeKeyValuePairFn) => {
const { key } = KeyValue;
const encryptedKey = crypter().keyCrypt(`${key}`).toString();
return _removeKeyValuePairFn(encryptedKey);
};
const clearStore = (_clearStoreFn) => {
return _clearStoreFn();
};
const getKeyName = (KeyValue, _getKeyNameFn) => {
const { key } = KeyValue;
return _getKeyNameFn(`${key}`);
};
module.exports = secureStorage