安全存储 - 每个会话临时

时间:2012-07-03 14:16:22

标签: security session firefox firefox-addon storage

我正在使用firefox插件,需要安全地存储一些用户数据(没有其他扩展,网站应该可以访问它,数据应该只存储,直到浏览器会话关闭)。

你们有没有人建议我应该使用的存储空间?

如果你认为将它存储为文件是个好主意,你能指点我如何加密它并在飞行中解密吗?

1 个答案:

答案 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。