UNPKG

websecure-local-storage

Version:

secure localstorage data

85 lines (63 loc) 2.53 kB
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