2012-07-03 5 views
0

Я работаю над дополнением firefox и должен надежно хранить некоторые пользовательские данные (никакое другое расширение, веб-сайт не должен иметь к нему доступ, а данные должны храниться только до закрытия сеанса браузера).Безопасное хранилище - временное за сеанс

Может ли кто-нибудь из вас посоветовать на хранение, который я должен использовать?

Если вы считаете, что это хорошая идея сохранить его в виде файлов, можете ли вы указать мне направление на то, как его зашифровать и расшифровать в полете?

+0

Я могу только дать краткий обзор того, как это сделать (предполагая, что надстройки структурированы аналогично хромовым расширениям): На вашей фоновой странице (или аналогичной) вы создаете свой объект магазина. Затем также в своем расширении вы передаете значения от пользователя (действительно .... шифрование в JS - ложное обещание ... лучше всего вы можете реализовать обходной мусор и base64 или обфускать свой код ... двоичный все остальное было бы излишним для небезопасного метода) - фоновые страницы (по крайней мере, в хроме) не позволяют веб-сайтам напрямую взаимодействовать с ними. Это ваша мера безопасности ... – rlemon

+0

Итак, сценарий будет принимать пользовательские данные, (зашифровать?), Отправить его на фоновый рисунок, который хранит его в своем собственном контексте. У вас есть другая специальная функция для возврата этих данных (с учетом ключа?) - и потому, что это переменная, работающая на фоновой странице в течение всего сеанса, как только браузер закрывается, данные теряются. Но опять же, так я бы сделал это в Chrome. Я должен предположить, что расширения аналогичны (или я отсюда?) – rlemon

ответ

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.

Смежные вопросы