我正在使用firefox插件,需要安全地存储一些用户数据(没有其他扩展,网站应该可以访问它,数据应该只存储,直到浏览器会话关闭)。
你们有没有人建议我应该使用的存储空间?
如果你认为将它存储为文件是个好主意,你能指点我如何加密它并在飞行中解密吗?
答案 0 :(得分:0)
您的JavaScript代码和来自其他扩展程序的JavaScript代码是相同的 - 告诉哪一个是可靠的,几乎不可能。但是,如果您可以隔离需要使用数据的代码部分,那么您可以简单地使用JavaScript自己的机制。特别是,闭包可以访问其他代码无法访问的变量。一个例子:
function storeLoginData()
{
var user = prompt("Please enter your user name");
var pass = prompt("Please enter your password");
return function(testUser, testPass)
{
return testUser == user && testPass == pass;
};
}
var verifier = storeLoginData();
if (verifier("foo", "bar"))
alert("Your login credentials are foo:bar");
请注意,storeLoginData
函数之外的代码只能调用返回的闭包,但无法访问其变量。在示例中,仅限于检查用户名/密码组合是否正确。如果你让你的孤立代码在计时器或类似的东西上自主行动,你甚至可以删除这个漏洞:
function storeData(data)
{
var timer = Components.classes["@mozilla.org/timer;1"]
.createInstance(Components.interfaces.nsITimer);
timer.initWithCallback(function()
{
// Do something with data here
}, 1000, timer.TYPE_ONE_SHOT);
return function() {};
}
var data = ...;
var dataStorage = storeData(data);
data = null;
注意主代码如何将data
变量传递给storeData
并在此之后将其置零 - 所有对变量的引用现在都在storeData
函数内。这里返回的闭包是无用的,它唯一的目标是保持对timer
变量的引用 - 如果没有定时器将被垃圾收集并且永远不会触发。此解决方案的安全性依赖于以下事实:无法枚举系统中的所有计时器 - 例如,对于计时器对象而言,这是正确的,但不是事件侦听器或观察者。
当然,数据在内存中保持未加密状态 - 这是难以避免的。因此,任何二进制代码仍然可以读取它,该保护仅适用于JavaScript。