Перше правило безпеки програми: Будь-яка машина, до якої зловмисник отримує необмежений фізичний або електронний доступ, тепер належить вашому зловмиснику, незалежно від того, де він насправді є чи за що ви заплатили за нього.
Друге правило безпеки програми: Будь-яке програмне забезпечення, яке залишає фізичні межі, до яких зловмисник не може проникнути, тепер належить вашому зловмиснику, незалежно від того, скільки часу ви витратили на його кодування.
Третє правило: будь-яка інформація, яка залишає ті самі фізичні межі, до яких зловмисник не може проникнути, тепер належить вашому зловмиснику, незалежно від того, наскільки вона для вас цінна.
Основи безпеки інформаційних технологій базуються на цих трьох основоположних принципах; єдиний справді захищений комп’ютер - це той, який замкнений у сейфі, у клітці Farraday, у сталевій клітці. Є комп’ютери, які проводять більшу частину свого сервісного життя саме в такому стані; раз на рік (або рідше) вони генерують приватні ключі для довірених кореневих служб сертифікації (перед безліччю свідків з камерами, що записують кожен сантиметр приміщення, в якому вони знаходяться).
Зараз більшість комп'ютерів не використовуються в таких середовищах; вони фізично перебувають на відкритому повітрі, підключені до Інтернету по бездротовому радіоканалу. Словом, вони вразливі, як і їх програмне забезпечення. Тому їм не слід довіряти. Існують певні речі, які комп’ютери та їх програмне забезпечення повинні знати або робити для того, щоб бути корисними, але слід бути обережним, щоб вони ніколи не могли знати або зробити достатньо для заподіяння шкоди (принаймні, не постійного пошкодження поза межами цієї однієї машини ).
Ви вже все це знали; саме тому ви намагаєтеся захистити код своєї програми. Але в цьому криється перша проблема; інструменти обфускування можуть зробити код безладним для людини, щоб спробувати перекопати, але програма все одно має працювати; це означає, що фактичний логічний потік програми та даних, які він використовує, не впливають на обфускацію. Враховуючи невелику завзятість, зловмисник може просто скасувати коду, і це навіть не потрібно в певних випадках, коли те, на що він дивиться, не може бути іншим, окрім того, що шукає.
Натомість вам слід намагатися переконатися, що зловмисник нічого не може зробити з вашим кодом, як би не було легко отримати чітку його копію. Це означає, що жодних важко зашифрованих секретів, оскільки ці секрети не є секретними, як тільки код покидає будівлю, в якій ви його розробили.
Ці важко кодовані ключові значення слід повністю видалити з вихідного коду програми. Натомість вони повинні бути в одному з трьох місць; енергонезалежна пам’ять на пристрої, що зловмиснику важче (але все ж не неможливо) отримати копію офлайн; постійно на серверному кластері, до якого ви керуєте доступом залізним кулаком; або у другому сховищі даних, не пов’язаному з вашим пристроєм або серверами, наприклад, фізичною карткою або пам'яттю вашого користувача (це означає, що з часом вона буде в мінливій пам'яті, але це не повинно бути довгим).
Розглянемо наступну схему. Користувач вводить свої дані для програми із пам'яті в пристрій. Ви, на жаль, повинні довіряти, що пристрій користувача вже не порушений кейлоггером або троянським файлом; найкраще, що ви можете зробити в цьому плані - це реалізація багатофакторної безпеки, запам’ятовуючи важко підроблену ідентифікаційну інформацію про пристрої, якими користувач користувався (MAC / IP, IMEI тощо), та надаючи принаймні один додатковий канал яку спробу входу на незнайомий пристрій можна перевірити.
Після введення облікових даних замовчується клієнтським програмним забезпеченням (використовуючи захищений хеш), а облікові дані простого тексту відкидаються; вони виконували своє призначення Засмучені облікові дані надсилаються по захищеному каналу на сервер, що підтверджує сертифікат, який знову їх хеширует для отримання даних, що використовуються для перевірки дійсності входу. Таким чином, клієнт ніколи не знає, що насправді порівнюється зі значенням бази даних, сервер додатків ніколи не знає облікових даних простого тексту за тим, що він отримує для перевірки, сервер даних ніколи не знає, як виробляються дані, які він зберігає для перевірки, і людина в середина бачить лише хитрість, навіть якщо захищений канал був порушений.
Після перевірки сервер передає маркер назад по каналу. Маркер корисний лише під час безпечного сеансу, складається з випадкового шуму або зашифрованої (і, таким чином, перевіреної) копії ідентифікаторів сеансу, і клієнтська програма повинна надіслати цей маркер на тому ж каналі на сервер у рамках будь-якого запиту щось робити. Клієнтська програма зробить це багато разів, тому що вона не може робити нічого, пов’язане з грошима, конфіденційними даними чи іншим, що може завдати шкоди самому; він повинен замість цього попросити сервер виконати це завдання. Клієнтська програма ніколи не записує будь-яку конфіденційну інформацію в стійку пам'ять на самому пристрої, принаймні, не в простому тексті; клієнт може запитати у сервера через захищений канал симетричний ключ для шифрування будь-яких локальних даних, які сервер запам'ятає; в подальшому сеансі клієнт може попросити сервер того ж ключа, щоб розшифрувати дані для використання в енергонезалежної пам'яті. Ці дані також не будуть єдиною копією; все, що зберігає клієнт, також повинно бути передано в якійсь формі на сервер.
Очевидно, це робить вашу програму сильно залежною від доступу до Інтернету; клієнтський пристрій не може виконувати жодну з основних функцій без належного підключення до сервера та автентифікації. Не відрізняється від Facebook, насправді.
Тепер комп'ютер, якого хоче зловмисник, - це ваш сервер, адже саме він, а не клієнтська програма / пристрій, - це те, що може заробити йому гроші або заподіяти іншим людям біль за його задоволення. Це добре; Ви отримуєте набагато більше грошей за гроші, витрачені гроші та зусилля на безпеку сервера, ніж намагаючись захистити всіх клієнтів. Сервер може стояти за всіма брандмауерами та іншими електронними засобами безпеки, а також додатково може бути фізично захищений за сталевим, бетонним, клавіатурним / контактним доступом та цілодобовим відеоспостереженням. Ваш зловмисник дійсно повинен бути дуже складним, щоб отримати будь-який доступ до сервера безпосередньо, і ви (повинні) про це дізнатися негайно.
Найкраще, що може зробити зловмисник - це викрасти телефон та облікові дані користувача та увійти на сервер з обмеженими правами клієнта. Якщо це станеться, як і втрата кредитної картки, законному користувачеві слід доручити зателефонувати на номер 800 (бажано легко запам’ятати, а не на звороті картки, яку вони мали б у своєму гаманці, гаманці чи портфелі, які можуть бути викрадені поряд із мобільним пристроєм) з будь-якого телефону, до якого вони можуть отримати доступ, що підключає їх безпосередньо до обслуговування клієнтів. Вони заявляють, що їхній телефон був викрадений, надають основний унікальний ідентифікатор, а обліковий запис заблоковано, будь-які транзакції, які зловмисник, можливо, міг обробити, повертаються назад, а зловмисник повертається до першого.