存储Localstorage没有任何保护。 Web应用程序对服务器的依赖性越来越小。
使用localstorage作为数据的应用程序如何存储它,以便需要密码才能读取它。
答案 0 :(得分:3)
服务器上的密码通常使用SHA1或SHA512之类的散列。当服务器收到带有密码的请求时,它会对其进行哈希处理,并对它们进行比较。如果它们匹配,则服务器加载一些数据,对其进行处理,然后将其发送回用户。如果我们尝试使用客户端JavaScript执行此操作,则必须已经提供了纯文本。
散列的替代方法是密码,例如AES。谷歌上有一个crypto-js library提供这样的服务。在gzip之前,独立的缩小的AES文件大约是13kb。
库的一个限制是AES数据的JSON序列化。他们的documentation确实为此提供了解决方案。
注意:这不是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);
如果用户的密码在几分钟内没有移动鼠标,那么“忘记”用户的密码也是明智之举。