Javascript 如何检查浏览器';s存储对象是否是localStorage或sessionStorage来管理客户端中的静态/动态密钥?

Javascript 如何检查浏览器';s存储对象是否是localStorage或sessionStorage来管理客户端中的静态/动态密钥?,javascript,angular,typescript,local-storage,session-storage,Javascript,Angular,Typescript,Local Storage,Session Storage,我设计了一个可装饰的存储服务,其中的示例类似于typescript/javascript中的getExpirableStorage(getSecureStorage(getLocalStorage()| getSessionStorage()) 为了实现getSecureStorage,我使用了一个硬编码静态密码密钥,并对要添加到本地或会话存储的密钥/值对的每个值进行加密 由于我们已经在客户端保留了密码密钥,因此我决定在每次过期后动态生成密钥,以防止用户以某种方式从源获取密钥并与其他人共享该密钥

我设计了一个可装饰的存储服务,其中的示例类似于typescript/javascript中的
getExpirableStorage(getSecureStorage(getLocalStorage()| getSessionStorage())

为了实现
getSecureStorage
,我使用了一个硬编码静态密码密钥,并对要添加到本地或会话存储的密钥/值对的每个值进行加密

由于我们已经在客户端保留了密码密钥,因此我决定在每次过期后动态生成密钥,以防止用户以某种方式从源获取密钥并与其他人共享该密钥。在这种情况下,我需要为每个不同的密钥/值存储每个新的密码密钥

createSecureStorage(存储:存储):存储{
var cipherKeyMap=this.keyMapping;
let privateState=函数(){
让密码钥匙;
this.encrypt=函数(键:string,数据:string):string{
让entry=cipherKeyMap.find(entry=>entry.key==key);
如果(条目){
cipherKey=entry.cipherKey;
}否则{
cipherKey=Array.from({length:16},()=>Math.floor(Math.random()*90));
push({“key”:key,“cipherKey”:cipherKey});
//...
};
this.decrypt=函数(键:string,数据:string):string{
//...
};
}
let state=新私有状态();
返回{
setItem(键:字符串,值:字符串){
//...
},
getItem(键:字符串){
//...
},
//从expirableSecureStorage触发
removeItem(键:字符串){
存储。删除项(键);
拼接(cipherKeyMap.findIndex(r=>r.key==key),1);
}
} 
}
上述函数适用于
本地存储
会话存储
,其类型为
存储
,也可作为

//lib.dom.d.ts
声明var会话存储:存储;
声明var localStorage:Storage;
此服务将用于来自多个客户端的多个情况,以获取将保存在这些存储中的值


对于
createSecureStorage
函数,我意识到如果传递的存储是
localStorage
,当用户关闭选项卡/窗口时,应用程序状态将消失,我将丢失密码密钥,但相关数据将保留在本地存储中,并使用这些密钥进行加密

我想我必须做一件事:

  • 管理本地存储中随机生成的密码密钥的持久性或清除
  • 或者只将使用硬编码静态密码密钥进行加密的值放入localStorage,并将使用动态生成的密码密钥进行加密的值放入sessionStorage
  • 我选择#2是因为我不想在客户机中保留密码密钥,因为我们当前的状态也不是理想的安全状态

    因此,要做到这一点,我认为我需要区分本地存储和会话存储


    如何区分sessionStorage和localStorage?

    要确定传递的对象是
    localStorage
    还是
    sessionStorage
    ,只需比较它们,因为对象是通过引用进行比较的

    function getStorage(storage){console.log(storage === localStorage)};
    getStorage(localStorage);
    getStorage(sessionStorage);
    

    您可以尝试
    instanceof
    operator@canbax,谢谢,但是localStorage和secureStorage都是
    Storage
    的类型,我该如何使用它?您可以尝试为每种类型实现两个不同的函数。我曾想过,但我认为它会复制代码。您认为我们可以在不复制m的情况下实现哪一部分uch?请注意,即使存在
    localStorage
    对象,您也可能无法在其上存储数据,这是因为私人浏览、citrix、缺少对AppData的本地访问,可能还有更多。