Am un ansamblu care ar trebui nu utilizat de nicio altă aplicație decât executabilul desemnat. Dați-mi niște instrucțiuni pentru a face acest lucru.
S-ar putea să setați acest lucru în politicile de securitate a accesului la coduri din ansamblu.
Ar trebui să puteți face totul intern, iar apoi utilizați InternalsVisibleTo Atribut pentru a acorda doar acelui acces la metode interne.
În .Net 2.0 sau mai bine, faceți totul intern, apoi utilizați Ansambluri de prieteni
http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx
Acest lucru nu va opri reflecția. Vreau să încorporez câteva din informațiile de mai jos. Dacă aveți absolut nevoie să opriți pe cineva să sune, probabil cea mai bună soluție este:
De asemenea, puteți să verificați stiva de apel și să obțineți ansamblul pentru fiecare apelant și asigurați-vă că toate acestea sunt semnate cu aceeași cheie ca și ansamblul.
Dacă asamblarea a fost un serviciu web, de exemplu, ați putea asigura că executabilul desemnat trece o valoare secretă în mesajul SOAP.
Puteți folosi obfuscation.
Aceasta se va transforma:
int MySecretPrimeDetectionAlgorithm(int lastPrimeNumber);
În ceva necitit ca:
int Asdfasdfasdfasdfasdfasdfasdf(int qwerqwerqwerqwerqwerqwer);
Altele vor putea să-ți folosească ansamblul, dar va fi dificil să faci orice lucru sensibil.
100% complet imposibil, fără a sări prin niște cercuri.
Unul dintre avantajele utilizării .NET este capacitatea de a folosi reflecția, care este încărcarea unui ansamblu și inspectarea acestuia, metodele de apelare dinamic etc. Acest lucru face posibilă interopul între VB.NET și F #.
Cu toate acestea, deoarece codul dvs. este într-un ansamblu gestionat, înseamnă că oricine poate adăuga o referință la codul dvs. și poate invoca metodele sale publice sau le poate încărca utilizând metode de reflecție și apeluri private . Chiar dacă "obfuscați" codul, oamenii vor putea totuși să folosească reflecția și să vă invite codul. Cu toate acestea, deoarece toate numele vor fi mascate făcând ceva este prohibitiv dificil.
Dacă trebuie să expediați codul .NET într-o manieră care împiedică alți utilizatori să-l execute, este posibil să aveți posibilitatea să GNEN binar (compilați-l la x86) și să expediați aceste fișiere binare.
Nu cunosc specificul situației tale, dar obfuscația ar trebui să fie suficient de bună.
The Code Access Security attribute that @Charles Graham mentions is StrongNameIdentityPermissionAttribute
După cum au menționat unii oameni, folosiți atributul InternalsVisibleTo și marcați totul ca fiind intern. Desigur, acest lucru nu se va opune reflecției.
One thing that hasnt been mentioned is to ilmerge your assemblies into your main .exe/.dll/whatever, this will up the barrier for entry a bit (people won't be able to see your assemby sitting on its own asking to be referenced), but wont stop the reflection route..
UPDATE: De asemenea, IIRC, ilmerge are o trăsătură în care poate internaliza automat ansamblurile care au fuzionat, ceea ce înseamnă că nu trebuie să utilizați InternalsVisibleTo deloc
Puteți semna ansamblul și executabilul cu aceeași cheie și apoi puneți o verificare în constructorul claselor pe care doriți să le protejați:
public class NotForAnyoneElse {
public NotForAnyoneElse() {
if (typeof(NotForAnyoneElse).Assembly.GetName().GetPublicKeyToken() != Assembly.GetEntryAssembly().GetName().GetPublicKeyToken()) {
throw new SomeException(...);
}
}
}
De asemenea, puteți să vă uitați la utilizarea ambalatorului și a compresorului executabil Netz .
Acest lucru ia ansamblurile dvs. și fișierul .exe și le împachetează într-un singur executabil, astfel încât acestea să nu fie vizibile pentru lumea exterioară fără să se sapă în jur.
Cred că acest lucru este suficient pentru a împiedica accesul pentru majoritatea programatorilor .net.
Un mare beneficiu al abordării .netz este că nu necesită schimbarea codului. Un alt avantaj este că simplifică cu adevărat procesul de instalare.
Se pare că sunteți în căutarea unui instrument de protecție sau de obfuscare. Deși nu există un glonț de argint, instrumentul de protecție recomandat este smartassembly . Unele alternative sunt Salamander Obfuscator , dotfuscator și Xenocode .
Din păcate, dacă dai octeții cuiva pentru a fi citit ... dacă au suficient timp și efort, ei pot găsi modalitatea de a încărca și apela codul. Pentru a răspunde în mod preemptiv la un comentariu pe care îl văd întrebați frecvent: Salamander vă va împiedica încărcarea directă a codului în instrumentul Reflector, dar am avut mai bine (de exemplu, mai fiabile) experiențe cu smartassembly.
Sper că acest lucru vă ajută. :)
Nu sunt sigur dacă aceasta este o cale disponibilă pentru dvs., dar poate aveți posibilitatea să găzduiți ansamblul utilizând serviciile Web WCF sau ASP.NET și să utilizați un anumit tip de schemă de autentificare (LDAP, perechi de chei publice/rpivate etc.) pentru a vă asigura numai clienții autorizați se conectează. Acest lucru va ține adunarea fizică din mâinile oricui altcuiva și puteți controla cine se conectează la ea. Doar un gand.
Trebuie doar să cereți un cod de trecere care să fie trimis utilizând apelul funcției și dacă nu a fost autorizat, atunci nimic nu funcționează, cum ar fi .setAuthorizeCode ('123456'), apoi în fiecare loc care poate fi folosit trebuie să verifice dacă autorizeCode! = 123456 apoi aruncați eroare sau doar ieșiți din ... Nu sună ca un răspuns bun pentru reutilizare, dar acesta este exact punctul.
Singura dată când ar putea fi folosită este de dvs. și când codificați cu greu codul de autorizare în program.
Doar un gând, ar putea fi ceea ce căutați sau vă poate inspira la ceva mai bun.