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

Bri*_*and 1 javascript security aes local-storage

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

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

Bri*_*and 5

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

散列的替代方法是密码,例如 AES。Google 上有一个crypto-js 库提供此类服务。在 gzip 之前,独立的压缩 AES 文件大约为 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

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

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

为了取回它,我们可以这样做:

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

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