自定义封装sessionStorage(3DES加密解密)

关于3DES的sessionStorage加密解密及用法

安装好crypto-js模块(npm install crypto-js)

//导入crypto-js模块
const CryptoJS = require("crypto-js");

//封装自定义类 MyStorage 
export class MyStorage {
    // 这里采用token作为key,若不用token作为key可自定义
    // static key = '0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF';
    // 向量iv写死,也可由其他固定值代替
    static iv = '01234567';
    
    //补位key,让key填满64位,这里补0
    static padKey(tokenKey) {
        const tokenKeyLength = tokenKey.length;
        let paddedKey = tokenKey;
        if (tokenKeyLength < 64) {
            const paddingLength = 64 - tokenKeyLength;
            const padding = '\0'.repeat(paddingLength);
            paddedKey = tokenKey + padding;
        }
        return paddedKey;
    }

    //加密处理
    static encrypt(value, tokenKey) {
        const plaintext = typeof value === 'string' ? value : JSON.stringify(value);
        const paddedKey = this.padKey(tokenKey);
        const encrypted = CryptoJS.TripleDES.encrypt(plaintext,        CryptoJS.enc.Hex.parse(paddedKey), {
            iv: CryptoJS.enc.Hex.parse(this.iv)
        });
        return encrypted.toString();
    }

    //解密处理
    static decrypt(encryptedValue, tokenKey) {
        const paddedKey = this.padKey(tokenKey);
        const decrypted = CryptoJS.TripleDES.decrypt(encryptedValue,           CryptoJS.enc.Hex.parse(paddedKey), {
            iv: CryptoJS.enc.Hex.parse(this.iv)
        }).toString(CryptoJS.enc.Utf8);

        try {
            return JSON.parse(decrypted);
        } catch (error) {
            return decrypted;
        }
    }

    //对sessionStorage.getItem() 方法封装
    static getItem(key, encryptionKey) {
        const encryptedKey = this.encrypt(key, encryptionKey);
        const encryptedValue = sessionStorage.getItem(encryptedKey);
        return encryptedValue !== null ? (Object.prototype.toString.call(this.decrypt(encryptedValue, encryptionKey)) == '[object Object]' ? JSON.stringify(this.decrypt(encryptedValue, encryptionKey)) : String(this.decrypt(encryptedValue, encryptionKey))): null;
    }

    //对sessionStorage.setItem() 方法封装
    static setItem(key, value, encryptionKey) {
        const encryptedKey = this.encrypt(key, encryptionKey);
        const encryptedValue = this.encrypt(value, encryptionKey);
        return sessionStorage.setItem(encryptedKey, encryptedValue);
    }

    //对sessionStorage.removeItem() 方法封装
    static removeItem(key, tokenKey) {
        const encryptedKey = this.encrypt(key, tokenKey);
        return sessionStorage.removeItem(encryptedKey);
    }

    //对sessionStorage.clear() 方法封装
    static clear() {
        return sessionStorage.clear();
    }

    //对sessionStorage.key() 方法封装
    static key(index, tokenKey) {
        const encryptedKey = sessionStorage.key(index);
        return encryptedKey !== null ? this.decrypt(encryptedKey, tokenKey) : null;
    }
    
    //属性 sessionStorage 对象中的数据项 (键值对)数量
    static get length() {
        return sessionStorage.length;
    }

}

本例使用token作为加密解密key值

sessionStorage.setItem("token","123456789")
**用法**
//设置key为'Sumu',value为'sumu10086'的会话存储。( 以加密形式存储,将键值对添加到存储中;如果键名存在,则更新其对应的值。 )
MyStorage.setItem('Sumu', 'sumu10086', sessionStorage.getItem("token"))

//从会话存储中取到key为'Sumu'对应的值。( 返回键名('Sumu')对应的值('sumu10086'的加密文本)。若没有返回null。 )
MyStorage.getItem('Sumu', sessionStorage.getItem("token"))

//去除key为'Sumu'的会话存储。( 将指定的键名('Sumu')从 sessionStorage 对象中移除。 )
MyStorage.removeItem('Sumu', sessionStorage.getItem("token"))
      
//返回当前 sessionStorage 对象的第index序号的key名称。若没有返回null。
MyStorage.key(index, sessionStorage.getItem("token"))
     
//返回一个整数,表示存储在 sessionStorage 对象中的数据项(键值对)数量。
MyStorage.length()

//清除 sessionStorage 对象所有的项。
MyStorage.clear()

结果如图:


posted @ 2024-01-17 17:52  苏沐~  阅读(67)  评论(0编辑  收藏  举报