Чи можна локальне зберігання коли-небудь вважати безпечним? [зачинено]


161

Мені потрібно розробити веб-додаток, який буде функціонувати в режимі офлайн тривалий час. Для того, щоб це було життєздатним, я не можу уникнути збереження конфіденційних даних (особистих даних, але не тих, які ви б тільки зберігали хешовані) у локальному сховищі.

Я погоджуюсь, що це не рекомендується, але, маючи невеликий вибір, я роблю наступне для захисту даних:

  • шифруючи все, що перебуває у локальному сховищі, використовуючи крипто-бібліотеку Stanford javascript та AES-256
  • пароль користувача - це ключ шифрування і не зберігається на пристрої
  • обслуговує весь вміст (у режимі онлайн) з одного надійного сервера через ssl
  • перевірка всіх даних, що йдуть до локальних сховищ на сервері та за допомогою проекту antasamy
  • у розділі мережі Appcache, не використовуючи *, а натомість перелічує лише URI, необхідні для з'єднання з надійним сервером
  • як правило, намагаються застосувати вказівки, запропоновані в шпаргалці OWASP XSS

Я розумію, що диявол часто знаходиться в деталях, і знаю, що існує багато скептицизму щодо локального зберігання та безпеки на основі JavaScript загалом. Хтось може прокоментувати, чи є:

  • основні недоліки у вищезазначеному підході?
  • можливі рішення таких недоліків?
  • будь-який кращий спосіб забезпечити локальне зберігання, коли програма html 5 повинна функціонувати в режимі офлайн протягом тривалого часу?

Дякуємо за будь-яку допомогу.


"Я приймаю, що це не рекомендується практика" - Це так? Чи не навпаки, що це було створено насправді для цього?
хакре

2
Для уточнення, я мав на увазі не рекомендовану практику зберігання конфіденційних даних у локальному сховищі.
користувач1173706

Так, що вам не слід передавати конфіденційні дані у великих мережах?
хакре

@ user1173706 Чому програма повинна функціонувати для роботи протягом тривалого часу в режимі офлайн? Які користувачі схожі? Які браузери вам потрібно підтримувати? Я, напевно, думаю, що це можливо, але мені потрібно знати особливості вашого сценарію.
Бенджамін Груенбаум

@Benjamin я оновив питання. Дякую.
користувач1173706

Відповіді:


74

WebCrypto

Проблеми з криптографією в JavaScript на стороні клієнта (браузера) детально описані нижче. Усі, окрім однієї з цих проблем, не стосуються API WebCrypto , який зараз досить добре підтримується .

Для офлайн-програми потрібно все-таки розробити та впровадити захищену сховище ключів.

Убік: Якщо ви використовуєте Node.js, використовуйте вбудований крипто API.

Криптовалюта Native-Javascript (pre-WebCrypto)

Я припускаю, що головна проблема - це хтось із фізичним доступом до комп'ютера, який читає localStorageваш сайт, і ви хочете, щоб криптографія допомогла запобігти цьому доступу.

Якщо хтось має фізичний доступ, ви також відкриті для атак інших і гірших за читання. До них відносяться (але не обмежуються ними): кейлоггери, модифікація сценарію офлайн, введення локального скрипту, отруєння кешем браузера та переадресації DNS. Ці атаки спрацьовують лише у тому випадку, якщо користувач користується машиною після її злому. Тим не менш, фізичний доступ у такому сценарії означає, що у вас є більші проблеми.

Тож майте на увазі, що обмежений сценарій, коли місцева криптовалюта є цінною, була б, якщо машина викрадена.

Є бібліотеки, які реалізують потрібну функціональність, наприклад, крипто-бібліотека Stanford Javascript . Однак є властиві слабкі сторони (про що йдеться у посиланні з відповіді @ ircmaxell):

  1. Відсутність ентропії / генерації випадкових чисел;
  2. Відсутність захищеного сховища ключів, тобто приватний ключ повинен бути захищений паролем, якщо він зберігається локально або зберігається на сервері (який забороняє доступ в автономному режимі);
  3. Відсутність безпечного стирання;
  4. Відсутність часових характеристик.

Кожна з цих слабкостей відповідає категорії криптографічних компромісів. Іншими словами, хоча у вас може бути "криптовалюта" за назвою, вона буде значно нижчою жорсткості, до якої прагнемо на практиці.

Все, що говорилося, актуарна оцінка не настільки тривіальна, як "Криптовалюта Javascript слабка, не використовуйте її". Це не схвалення, суто застереження, і воно вимагає, щоб ви повністю зрозуміли викриття вищезазначених слабкостей, частоту та вартість векторів, з якими ви стикаєтеся, і вашу здатність до пом'якшення чи страхування на випадок збою: криптовалюта Javascript, в незважаючи на слабкі сторони, це може зменшити ваше опромінення, але лише проти злодіїв з обмеженими технічними можливостями. Однак, ви повинні припустити, що криптовалюта Javascript не має значення щодо рішучого та здібного зловмисника, який націлює цю інформацію. Дехто вважає оманливим називати дані "зашифрованими", коли відомо, що стільки слабких місць притаманні реалізації. Іншими словами, ви можете незначно зменшити свою технічну витримку, але ви збільшуєте свою фінансову експозицію від розкриття інформації. Кожна ситуація, звичайно, різна - і аналіз зменшення технічного впливу фінансового впливу нетривіальний. Ось наочна аналогія:Деякі банки потребують слабких паролів , незважаючи на властивий їм ризик, оскільки їх експозиція до втрат від слабких паролів менша за витрати кінцевого користувача на підтримку надійних паролів.

🔥 Якщо ви прочитали останній абзац і подумали "Хтось хлопець в Інтернеті на ім'я Брайан каже, що я можу використовувати криптовалюту Javascript", не використовуйте криптовалюту Javascript.

У випадку використання, описаному у питанні, здається, що користувачі мають більше сенсу шифрувати свій локальний розділ або домашній каталог та використовувати надійний пароль. Цей тип безпеки, як правило, добре перевірений, широко довірений і широко доступний.


Існує додаткова документація (цитати) для загальної позиції "не використовувати JavaScript-криптовалюту", наданої NCC Group з 2011 року: Криптографія JavaScript вважається шкідливою (особливо через лову 22 завантаження інструменту для перевірки завантажень ... Якість PRNG … Тощо)
amcgregor

58

Ну, основна передумова тут: ні, це ще не захищено.

В основному, ви не можете запустити криптовалюту в JavaScript: JavaScript Crypto вважається шкідливим .

Проблема полягає в тому, що ви не можете надійно занести криптовалюту в браузер, і навіть якщо б ви могли, JS не призначений для того, щоб запустити його надійно. Тому, поки у браузерів не буде криптографічного контейнера (який надають розшифровані медіа-розширення, але вони об'єднані для своїх цілей DRM), це зробити неможливо надійно.

Що стосується "Кращого шляху", то зараз його немає. Ваша єдина альтернатива - зберігати дані у простому тексті та сподіватися на найкраще. Або взагалі не зберігати інформацію. У будь-якому випадку.

Або це, або якщо вам потрібна така безпека, і вам потрібна локальна пам’ять, створіть власну програму ...


8
Downvoter: чи можете ви дати кращу відповідь? Я розумію, що це дещо суперечливе питання, коли між фахівцями з безпеки (і непрофесіоналами також є суттєві розбіжності), тому альтернативну точку зору варто було б поділити. Якщо ви не звертаєтесь з іншої причини, і в цьому випадку як я можу покращити цю відповідь?
ircmaxell

9
@ircmaxell не я, але я не згоден з цією відповіддю. "Проблема полягає в тому, що ви не можете надійно занести криптовалюту в браузер, і навіть якщо б ви могли, JS не призначений для того, щоб запустити його надійно." - Чому? Яка притаманна проблема? Ви можете використовувати бібліотеку шифрування JavaScript Stanford та шифрувати / розшифровувати в ній. Ви можете хеш, і ви можете зробити все надійно. Я не бачу тут суттєвої проблеми в автономному додатку в JS, який робить стандартний crpyto, як і додаток, побудований на будь-якій іншій мові.
Бенджамін Грюнбаум

11
@BenjaminGruenbaum: проблема полягає в тому, що існує кілька місць, де цей криптокод повинен взаємодіяти з кодом третьої сторони. Вся суть цієї статті, з якою я пов’язана, полягає в тому, що ви не можете контролювати середовище виконання. Отже, ви встановите крипто-ліб Стенфорда. Тоді що станеться, якщо якийсь плагін браузера переорієнтується, sjcl.encryptщоб надіслати ключ зловмиснику? У JS це 100% можливо, і ви нічого не можете зробити, щоб зупинити це. І це є основним моментом. Не існує механізмів "безпеки", які б не дозволяли іншим JS робити неприємні дії з вашими даними. І це проблема .
ircmaxell

13
@ircmaxell Якщо ви спите з собаками, ви не можете розраховувати, що не прокинетеся блохами. Якщо користувач встановлює додаток зловмисного програмного забезпечення, це точно так само, як користувач, який встановлює вірус на свій ПК, він нічим не відрізняється від нього. Ваша програма Java або C може бути настільки ж захищеною, як тільки вона отримує, але як тільки зловмисник зможе запустити код, який ви накрутили. Це не відрізняється від JS. Аддони не просто магічно з'являються у браузері. Більше того, збереження зашифрованої інформації не допоможе жодним чином, якщо користувач має зловмисне програмне забезпечення, оскільки це може просто викрасти дані в реальному часі.
Бенджамін Груенбаум

9
@BenjaminGruenbaum: не згоден. У звичайній програмі вам потрібно буде або скомпрометувати саму програму (для читання місць розташування пам'яті), або отримати кореневий доступ до вікна (компрометувати ОС). У будь-якому випадку вам потрібно скомпрометувати щось глибше, ніж просто нормальна поведінка. JS допускає це в нормальній поведінці. У чому проблема ...
ircmaxell

12

Як вивчення цієї теми, у мене є презентація під назвою "Захист TodoMVC за допомогою API веб-криптографії" ( відео , код ).

Він використовує API веб-криптографії для зберігання списку todo, зашифрованого в localStorage, захищаючи додаток паролем та використовуючи ключ, отриманий паролем для шифрування. Якщо ви забудете або втратите пароль, відновлення не буде. ( Відмова від відповідальності - це був POC і не призначений для використання у виробництві. )

Як свідчать інші відповіді, це все ще сприйнятливо для XSS або зловмисного програмного забезпечення, встановленого на клієнтському комп'ютері. Однак будь-які конфіденційні дані також будуть зберігатися в пам'яті, коли дані зберігаються на сервері і програма використовується. Я вважаю, що підтримка в режимі офлайн може бути важливим випадком використання.

Зрештою, шифрування localStorage, ймовірно, лише захищає дані від зловмисників, які читали лише доступ до системи або її резервного копіювання. Це додає невелику кількість захисту в глибину для експозиції даних A6, чутливих до A6, що відповідає 10 найпопулярнішим темам , і дозволяє відповісти "Чи зберігається будь-який із цих даних у чіткому тексті довгостроково?" правильно.


3

Тут справді цікава стаття. Я розглядаю можливість застосувати шифрування JS для забезпечення безпеки під час використання локального сховища. Абсолютно зрозуміло, що це забезпечить захист лише в тому випадку, якщо пристрій буде вкрадено (і реалізовано правильно). Він не забезпечить захист від кейлоггерів і т.д. Щодо статті "Криптовалюта JavaScript вважається шкідливою", згаданої у першій відповіді, у мене є одна критика; в ньому йдеться про "Ви можете використовувати SSL / TLS для вирішення цієї проблеми, але це дорого і складно". Я думаю, що це дуже амбітна претензія (і, можливо, досить упереджена). Так, SSL має вартість,

Мій висновок - Існує місце для кодування шифрувального коду на стороні клієнта, однак, як і у всіх програмах, розробники повинні визнавати його обмеження та реалізовувати, якщо вони підходять для їх потреб, і гарантуючи, що існують способи зменшення ризиків.


Історично були надзвичайні витрати (механічні, а не фінансові), пов'язані з первинними переговорами про з'єднання. До того, що корпорації будуть використовувати спеціалізовані пристрої для припинення SSL, які можуть стати фінансово затратними, ніж витрати на видачу сертифіката та гарантії. Сьогодні багато з цих питань були вирішені, наприклад, тривалість тривалості сесії, щоб уникнути початкового рукостискання при наступних запитах.
amcgregor

2

Не доступний для будь-якої веб-сторінки (правда), але легко доступний і легко редагується за допомогою інструментів розробника, таких як хром (ctl-shift-J). Тому перед зберіганням значення потрібна спеціальна криптовалюта.

Але, якщо javascript потрібно розшифрувати (перевірити), алгоритм розшифровки буде відкритий і ним можна керувати.

Javascript потребує повністю захищеного контейнера та можливості належним чином реалізувати приватні змінні та функції, доступні лише для js-перекладача. Але це порушує безпеку користувачів - оскільки дані відстеження можна використовувати безкарно.

Отже, JavaScript ніколи не буде повністю захищеним.


-29

Немає.

localStorage доступний на будь-якій веб-сторінці, і якщо у вас є ключ, ви можете змінити всі потрібні дані.

При цьому, якщо ви можете придумати спосіб безпечного шифрування ключів, не має значення, як ви передаєте дані, якщо ви можете містити дані в межах закриття, то дані (дещо) безпечні.


19
Недоступна "будь-яка веб-сторінка". Він доступний лише для сторінок у поточному домені.
dtabuenc

@dtabuenc навпаки, я заздалегідь зробив ручку, яка показує вам кожну пару ключів / значень у вашому localStorage , без жодних злому.
hellol11

3
Ні! Вибачте. Місцеве сховище є ізольованим на домен. Код, що працює в одному домені, не може отримати доступ до значень, які були збережені в локальному сховищі іншим доменом. Наприклад, google.com зберігає купу речей у локальних сховищах. Ви не зможете перерахувати жоден з ключів від google.com у прикладі пера.
dtabuenc

@dtabuenc перевірив це, ти маєш рацію.
hellol11
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.