繁体   English   中英

如何使用密码保护本地存储数据?

[英]How can I password protect localstorage data?

本地存储存储时没有任何保护。 Web应用程序对服务器的依赖性越来越小。

使用localstorage进行数据存储的应用程序如何存储它,以便需要密码才能读取它。

服务器上的密码通常通过使用诸如SHA1或SHA512之类的哈希来工作。 当服务器收到带有密码的请求时,它会对该请求进行哈希处理并进行比较。 如果它们匹配,则服务器加载一些数据,对其进行处理,然后将其发送回用户。 如果我们尝试使用客户端JavaScript进行此操作,则必须已经可以使用纯文本。

哈希的替代方法是密码,例如AES。 Google上有一个crypto-js库 ,可提供此类服务。 独立的最小化AES文件在gzip之前约为13kb。

该库的限制之一是AES数据的JSON序列化。 他们的文档 ,确实提供了解决方案。

注意:这不是JSON编码的对象,而是JSON编码解密对象所需的数据(当然,密码除外)。

var JsonFormatter = {
    stringify: function (cipherParams) {
        var jsonObj = {ct: cipherParams.ciphertext.toString(CryptoJS.enc.Base64)};
        if (cipherParams.iv) {jsonObj.iv = cipherParams.iv.toString();}
        if (cipherParams.salt) {jsonObj.s = cipherParams.salt.toString();}
        return JSON.stringify(jsonObj);
    },

    parse: function (jsonStr) {
        var jsonObj = JSON.parse(jsonStr);
        var cipherParams = CryptoJS.lib.CipherParams.create({
            ciphertext: CryptoJS.enc.Base64.parse(jsonObj.ct)
        });
        if (jsonObj.iv) {cipherParams.iv = CryptoJS.enc.Hex.parse(jsonObj.iv)}
        if (jsonObj.s) {cipherParams.salt = CryptoJS.enc.Hex.parse(jsonObj.s)}
        return cipherParams;
    }
};

要存储数据,我们可以这样做

var encoded = CryptoJS.AES.encrypt(JSON.stringify(data), password, {format: JsonFormatter}).ciphertext.toString();
localStorage.setItem("secret_stuff", encoded);

为了找回,我们可以做:

var stored = localStorage.getItem("secret_stuff");
var jsonString = CryptoJS.AES.decrypt(stored, password, {formatter: JsonFormatter}).toString();
var secretObject = JSON.parse(jsonString);

如果他们在几分钟内没有移动鼠标,那么“忘记”用户的密码也可能是明智的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM