Puncte:0

Cum să vă asigurați că fișierele de pe computerul client nu au fost modificate de client?

drapel ro

Proiectez un program pe care clienții îl pot descărca pe computer. Acest program trebuie să se sincronizeze cu serverul meu online în mod regulat pentru a confirma că codul de activare al clientului nu a expirat și că își plătesc facturile. Cu toate acestea, vreau ca programul să poată rula pentru o perioadă de până la 5 zile fără a fi nevoie să se conecteze. Acest lucru ar permite clientului să folosească programul pentru o perioadă de timp dacă își pierde conexiunea la internet. Acesta ar fi un mare bonus față de alte programe pe care clienții mei le folosesc și care devin complet inutile fără internet.

Pentru a realiza acest lucru, vreau să stochez un marcaj de timp într-un fișier text local.De fiecare dată când programul rulează, acesta poate verifica marca temporală pentru a vedea dacă este necesară o sincronizare online. Deci, dacă trec 5 zile fără o sincronizare online, programul va refuza să pornească până când clientul se sincronizează din nou.

Problema este cum stochez în siguranță acest fișier, astfel încât clientul să nu-l poată modifica. Dacă clientul poate doar să deschidă fișierul text și să schimbe marcajul de timp, programul ar putea fi păcălit să creadă că nu trebuie să se sincronizeze niciodată.

Am luat în considerare următoarele:

  1. Stocarea unei chei simetrice în interiorul programului care este utilizată pentru a cripta fișierul text, apoi decriptați-o atunci când este necesar pentru a-i asigura autenticitatea. Problema aici este că cheia simetrică ar trebui să fie fixată și stocată în program. Sunt un programator mai nou în Java, dar din câte înțeleg programele pot fi compilate invers și cheia simetrică poate fi obținută. De asemenea, această cheie simetrică ar putea locui în memorie și poate fi obținută. Toate distribuțiile programului ar trebui să aibă aceeași cheie simetrică încorporată (presupun), și aceasta ar fi o problemă, nu-i așa?

  2. O modalitate de a semna fișierul pentru a asigura autenticitatea. Nu știu multe despre criptare, dar asta sună exact ca numărul 1.

  3. Criptare asimetrică. Dar nu sunt sigur cum se poate realiza asta aici. Când programul se sincronizează, serverul online poate cripta o marca temporală cu o cheie publică și o poate trimite înapoi programului pentru a stoca conținutul criptat într-un fișier. Apoi ar putea fi decriptat cu o cheie privată. Acest lucru ar asigura că marca temporală a fost creată de serverul meu și nu de client. Problema este că oricine ar putea cripta o marca temporală cu cheia publică și o poate plasa în fișier, deoarece cheia publică este publică. De asemenea, cheia privată ar trebui să fie stocată în program, care revine la aceeași problemă ca #1.

Este chiar posibil să realizez ceea ce încerc să obțin?

Puncte:0
drapel my

Problema este cum stochez în siguranță acest fișier, astfel încât clientul să nu-l poată modifica. Dacă clientul poate doar să deschidă fișierul text și să schimbe marcajul de timp, programul ar putea fi păcălit să creadă că nu trebuie să se sincronizeze niciodată.

Am luat în considerare următoarele:

  1. O modalitate de a semna fișierul pentru a asigura autenticitatea.

Asta ar fi cel mai apropiat; modalitatea evidentă ar fi dacă serverul ar avea o cheie privată de semnătură, iar programul ar avea cheia publică corespunzătoare. Apoi, când sunteți conectat, serverul ar putea semna ștampila actuală și poate trimite acel marcaj de timp și semnătura clientului.

Apoi, când clientul nu se poate conecta, el verifică apoi marca de timp/semnătura mai recentă care a fost descărcată și verifică acea semnătură (folosind cheia publică care este instalată cu clientul); dacă se validează, atunci verificați dacă marca temporală nu are mai mult de cinci zile.

În plus, puteți include un hash al unor fișiere relevante (cele pe care clientul nu ar trebui să le modifice) în ceea ce semnează serverul; la momentul verificării, clientul și-ar aplica prin hash copiile fișierelor și le includea în verificare.

Atacatorul nu poate modifica marca temporală, deoarece nu poate modifica semnătura (și nu poate să o verifice); el poate înlocui ștampila/semnătura cu una anterioară, dar asta nu ar câștiga nimic.

Modalități posibile de a ataca acest lucru:

  • Modificați „ora curentă”; majoritatea sistemelor de operare vă permit să setați ora la orice dorește utilizatorul. Aceasta presupune un marcaj temporal validat (dacă nu este deosebit de precis).

  • Modificați programul (fie pentru a modifica cheia publică, fie, mai probabil, înlocuiți logica de validare cu ceva care spune întotdeauna „este valid). Aceasta este întotdeauna o problemă atunci când rulați într-o bază de calcul neîncrezătoare.

drapel ro
Hei @poncho, mulțumesc pentru toate ideile grozave. Îmi voi face ceva timp pentru a digera asta și a reveni la tine. Multumesc
drapel ro
Apreciez ajutorul vostru. Cred că înțeleg ce spui. Criptarea RSA asimetrică poate fi folosită în sens invers, în cazul în care cheia privată semnează ceva și apoi cheia publică poate fi folosită pentru a confirma autenticitatea. Stocați versiunea semnată și mesajul original, apoi asigurați-vă că se potrivesc. Semnătura ar fi putut proveni doar de la cheia privată. Are sens. În ceea ce privește atacul, este posibil să modifici codul într-un program compilat? Nu știu prea multe despre asta.Practic, orice program poate fi modificat și este doar ceva cu care dezvoltatorii trebuie să trăiască?
poncho avatar
drapel my
@Geoff: „În ceea ce privește atacarea, este posibil să se modifice codul într-un program compilat?”; nu este banal, dar poate fi făcut de cineva cu puțină experiență și instrumentarul potrivit.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.