mercoledì 30 marzo 2022

Come creare una password sicura

 Per creare una password sicura possiamo affidarci a :

-generatori online 

-applicazioni in esecuzione sul nostro pc

- oppure possiamo costruirla sommando caratteri che derivano dalle varie possibilità di cui sopra

  vediamole una categoria alla volta :

I generatori online  : esistono diversi siti che offrono di generare una password forte :

a) https://passwordsgenerator.net/  sito di uso immediato permette di fare parecchie scelte,dalla lunghezza della password ai tipi di caratteri da utilizzare,si può scegliere di non farsi trasmettere la password su internet ed invece generarla sul nostro dispositivo (flaggare checkbox "Generate On Your Device") , la connessione è comunque in httpS (quindi Sicura)


b) https://www.lastpass.com/it/features/password-generator : altro sito molto ben fatto ed immediato

    


si può scegliere la lunghezza della password, dopo si può scegliere un radio botton con 3 scelte:

Facile da dire: evita i numeri ed i caratteri speciali 

Facile da leggere: evita i caratteri ambigui : ad esempio 1 ed l oppure 0 ed O

Tutti i caratteri : in questo caso vengono utilizzati tutti i caratteri compresi quelli ambigui , i numeri, i simboli e tutti i caratteri compresi quelli maiuscoli e quelli minuscoli 

in seguito si può scegliere tra i check box quali insiemi di caratteri selezionare tra :

        Lettere maiuscole

        Lettere minuscole

        Numeri

        Simboli

c)   https://www.nexcess.net/web-tools/secure-password-generator/

     



Questo sito offre oltre alle password classiche anche le word based password in cui si scelgono quante parole devono comporre la password e quanti numeri devono essere presenti. Purtroppo il servizio è in sola lingua inglese quindi le parole "casuali" sono inglesi :-( .


Le applicazioni locali per generare password:  

a)Free password generator ,si tratta di un applicazione per windows 


Quest'applicazione ha il pregio di essere eseguita sul nostro computer localmente il che visto che si tratta di password magari "delicate", non guasta.

b) Un'altra applicazione gratuita è Advanced Password generator , 
     permette di generare una sola password alla volta
    

ma scorrendo sulla barra possiamo aggiornare la password alla lunghezza scelta e scorrendo avanti ed indietro le password sono sempre nuove , interessanti le "password options" che ci permettono anche di creare un insieme customizzato dei caratteri da usare per la costruzione delle password    


Ora che abbiamo visto alcune applicazioni web ed alcune applicazioni installabili sul nostro pc vediamo alcune tecniche per craccare le password in modo da essere consapevoli quando scegliamo una password rispetto alla possibilità che venga individuata.

-Attacco "Brute Force" : l' attacco di forza bruta esegue tutte le permutazioni possibili fino a trovare la password "giusta", in realtà questo tipo di attacco non è spesso utilizzato poichè una password robusta potrebbe richiedere secoli e secoli di cpu al 100% prima di trovare la password giusta , questo attacco è inefficace nel caso ci siano più parole ,oltre a caratteri casuali, che aumentino la "massa" della password

-Attacco dizionario: in questo caso l'attaccante dispone di un dizionario composto da un elenco di parole possibili e le prova,questo tipo di attacco è inefficace nel caso in cui facciano parte della password anche un pò di caratteri casuali 

Questi sono due tipi di attacco diretti , che cercano di trovare ognuno a sua modo la password . Se ad una password di 16 caratteri casuali aggiungiamo anche un paio di parole "casuali" (ad esempio "pizza4stagioni") magari inserendole dopo il terzo carattere (uno a caso va comunque bene ovviamente)  abbiamo una password praticamente inattaccabile con un attacco di forza bruta ed altrettanto resistente ad un attacco dizionario .

 Le parole servono a renderci più facile ricordare la password che non se fosse tutta di caratteri casuali, dobbiamo però evitare di usare scorciatoie che ci permettano di ricordare facilmente la password ma che siano a conoscenza anche di altri , un esempio: la data di nascita . 

In ogni caso è meglio cambiare la password spesso , al massimo ogni due-tre mesi.

Altra regola sempre valida non usare la stessa password per diversi siti-applicazioni poichè nel caso uno di questi ultimi fosse crackato sarebbero in pericolo anche gli altri nostri servizi che condividono quella password , i quali magari per l'accesso chiedono l'email oltre alla password e l'email è a volte molto facile da reperire.

Ovviamente fate attenzione alle cosiddette tecniche di social engineering : tra queste le più comuni consistono nel farsi dire dalla vittima le credenziali chiedendole tramite email o sms, potete avere una password "perfetta" ma se la consegnate ad un hacker serve a poco . 

Altro problema è dove custodire in sicurezza le password : 

una risposta a questa domanda possono essere i password manager : questo tipo di programmi salvano in modo crittografato le password che noi inseriamo utilizzando una password da noi impostata (detta generalmente master password) e le riportano in chiaro quando re-inseriamo la password.

Andiamo ad analizzare KeePass  password manager(https://keepass.info/):

 si tratta di un programma gratuito ed opensource(linguaggio c#) :  permette di utilizzare come algoritmo di cifratura AES-256 (https://it.wikipedia.org/wiki/Advanced_Encryption_Standard ),si tratta di un algoritmo di crittografia simmetrica quindi viene utilizzata la stessa password sia per crittografare che per decrittografare. I dati vengono salvati in locale sul nostro pc , è quindi fondamentale che il nostro disco non venga danneggiato per evitare di perdere tutto, è meglio aggiungere il backup del database di KeePass "nomefile.kdbx" ai nostri backup fatti su  un disco diverso , può andar bene anche una pendrive per salvare il db anche se i dischi sono generalmente meno soggetti a rottura rispetto alle pendrive. Fondamentale ricordare la master password ,se la dimentichiamo non possiano recuperare l'elenco di password che abbiamo inserito. Quando impostiamo la master password il programma può produrre un pdf da stampare su sui salvare locazione della copia di backup e master password : 


 Il pdf soprastante deve essere letto completamente ed una volta compilato deve essere riposto in un luogo sicuro come specifica il documento stesso.

L'interfaccia del programma è piuttosto    semplice.All'indirizzo https://keepass.info/help/base/index.html trovate l'help ed i numerosi link portano a puntuali help specifici  ,ad esempio KeePass può importare/esportare elenchi di password da altri gestori di password https://keepass.info/help/base/importexport.html oppure da file csv 


KeePass consente di compilare i form di login trascinando username e password salvate nei suoi elenchi, qui un immagine d'esempio: https://keepass.info/help/base/usingpws.html#dragdrop , usando questa comoda utilità evitiamo inoltre che un possibile keylogger possa memorizzare i caratteri immessi da tastiera. 

Questo software ha anche un sofisticato generatore di password :

per quanto io conosca è il miglior software per gestire le password in locale , gratuito ed opensource.





sabato 11 settembre 2021

Appunti su REST

 Rest(Representational State Transfer) è uno stile architetturale per i sistemi distribuiti ,esso non definisce né il formato della risposta ( ad esempio Json) nè il protocollo utilizzato. REST può essere applicato sia ad un URI sia al protocollo HTTP ,a tal proposito si può vedere il capitolo 6 della dissertazione di Roy Thomas Fielding :   https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf .

REST può essere definito attraverso l'esplicitazione di alcuni principi che ne modellano il funzionamento :

  1. client(consumatore del servizio) e server(fornitore del servizio) devono ignorare reciprocamente le logiche di funzionamento interne

  2. il servizio deve essere stateless

  3. cache: per migliorare il funzionamento del network è necessario che la response ad una request del client sia implicitamente marcata come cacheable o no cacheable ( vedi pag. 79 del testo sopracitato di Fielding)

  4. ogni risorsa deve essere univoca

  5. le risposte devono contenere le informazioni necessarie a fare il discovery ed ad informare il client su come utilizzare altre risorse , a tal fine la risposta contiene degli hypermedia (HATEOAS (Hypermedia as the Engine of Application State) , https://en.wikipedia.org/wiki/HATEOAS)


Per valutare quanto un API sia conforme ai principi REST si può utilizzare il Richardson Maturity Model (RMM , https://en.wikipedia.org/wiki/Richardson_Maturity_Model ,  https://martinfowler.com/articles/richardsonMaturityModel.html) ,l'RMM prevede quattro livelli ,dal meno conforme a REST (0) al più aderente(3) :

  • livello 0 : viene usato lo stesso endpoint per fare tutte le chiamate sul server

  • livello 1 : vengono resi disponibili endpoint differenti per risorse differenti ,ad esempio :

    Uri                                    Operations

    /bookingDestinations       retrieve

    /bookingReservations      add/cancel reservations

  • livello 2 : in questo caso si utilizzano i verbi http per chiamare risorse differenti quindi non si crea un endpoint “getreservations” ma si utilizza il verbo http “get” sull'indirizzo “reservations”, ad esempio :

    URI               HttpVerb   Operation

    /reservations   GET         get reservations

    /reservations   POST       add reservation

  • livello 3 : HATEOAS , ogni risposta contiene anche come svolgere altre azioni relative all'elemento in questione ,ad esempio se creiamo un Cliente ci potranno essere restituite nella risposta dal server anche le informazioni necessarie per visualizzarlo ed altre informazioni tramite hypermedia (https://en.wikipedia.org/wiki/HATEOAS)

L'argomento può essere approfondito  tramite l'opera sopracitata di Roy Thomas Fielding.


lunedì 5 aprile 2021

Eseguire automaticamente un antivirus su un file scaricato usando Chrome , alla fine del download

 Il codice è in versione pre-alpha . Qui il codice sorgente https://sourceforge.net/projects/antivirusdefenderforchrome/  . 
Supponiamo di utilizzare su un pc due antivirus: ad esempio Avira e Defender , il primo di occupa della scansione a realtime , il secondo viene utilizzato per eseguire delle scansioni periodiche , in questo modo si può usufruire,su richiesta, di due distinte liste aggiornate di segnature di virus per effettuare le scansioni e di due motori euristici .
Durante il download, il file scaricato da Chrome nella dir Download assume una o più fra tre estensioni temporanee : ".tmp" , ".crdownload",".part" ,gli altri browser hanno funzionamenti differenti ed il codice seguente richiede l'uso di una versione attuale di Chrome ,se il file ha un'altra estensione significa che il download è finito, il cambiamento del nome del file viene intercettato dall'evento Renamed  dell'oggetto FileSystemWatcher  e l'estensione è verificata dal metodo FindExtension :
scegliamo la directory da monitorare :







 public partial class Form1 : Form

    {
        string selectedPath = null;
        FileSystemWatcher watcher = new FileSystemWatcher();
        
        public Form1()
        {
            InitializeComponent();
        }             

        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult result = this.folderBrowserDialog1.ShowDialog();
            if (result == DialogResult.OK)
            {
                selectedPath = folderBrowserDialog1.SelectedPath;
                this.textBox1.Text = selectedPath;
            }
            watcher.Path = selectedPath;
            watcher.NotifyFilter = NotifyFilters.FileName;
            watcher.Filter = "*.*";
            watcher.Created += new FileSystemEventHandler(OnCreated);
            watcher.Renamed += new RenamedEventHandler(OnRenamed);
            watcher.EnableRaisingEvents = true;            
        }


 per eseguire chiamate  threadsafe  al controllo textBox2 utilizziamo la classe ParametrizedThread  ,

 il percorso sul vostro pc del file MpCmdRun.exe (l'eseguibile da linea di comando di Defender) potrebbe essere diverso da  "C:\Program Files\Windows Defender\MpCmdRun.exe" :

private void OnCreated(object source, FileSystemEventArgs e)
        {
            string name = e.Name;
            string s = this.textBox2.Text;
            s = s + name + " created file " + Environment.NewLine;
            ParametrizedThread p = new ParametrizedThread();
            p.currentForm = this;
            p.c = this.textBox2;
            p.text = s;
            Thread t = new Thread(p.ThreadProcSafe);
            t.Start();
        }

private void OnRenamed(object source, FileSystemEventArgs e)

        {   
            string ext=Path.GetExtension(e.FullPath);
            bool b = FindExtension(ext);
            if (!b)
            {
                string name = e.Name;
                string s = this.textBox2.Text;
                s = s + name + " renamed file completo" + Environment.NewLine;
                ParametrizedThread p = new ParametrizedThread();
                p.currentForm = this;
                p.c = this.textBox2;
                p.text = s;
                Thread t = new Thread(p.ThreadProcSafe);
                t.Start();
                
                ProcessStartInfo info = new ProcessStartInfo(@"C:\Program Files\Windows Defender\MpCmdRun.exe");               
                string fileName = e.FullPath;
                info.Arguments = " -Scan -ScanType 3 -File " + '"' + fileName + '"';
                info.WindowStyle = ProcessWindowStyle.Maximized;
                info.UseShellExecute = false;
                info.RedirectStandardOutput = true;
                Process proc = Process.Start(info);
                StreamReader sr = proc.StandardOutput;
                string msg = sr.ReadToEnd();
                string w = this.textBox2.Text;
                w = w + msg + Environment.NewLine;
                ParametrizedThread pt = new ParametrizedThread();
                pt.currentForm = this;
                pt.c = this.textBox2;
                pt.text = w;
                Thread t1 = new Thread(pt.ThreadProcSafe);
                t1.Start();
            } else { 
                string name = e.Name;
                string s = this.textBox2.Text;
                s = s + name + " renamed" + Environment.NewLine;
                ParametrizedThread p = new ParametrizedThread();
                p.currentForm = this;
                p.c = this.textBox2;
                p.text = s;
                Thread t = new Thread(p.ThreadProcSafe);
                t.Start();
            }
        }

         private bool FindExtension(string ext )
        {
            bool b = true;
            List<string> l = new List<string>();
            //funziona solo con chrome
            l.Add(".tmp");
            l.Add(".crdownload");
            l.Add(".part");            
            int result=l.FindIndex(element => element==ext);
            if(result == -1)
            {
                b = false;
            }
            return b;
        }
         ...................................
         ................................
         ...........................


    public class ParametrizedThread
    {

        public TextBox c = null;
        public string text = null;        
        delegate void SetTextCallback(string text ,Control c);       
        public Form currentForm = null;        
        public ParametrizedThread()
        {
        }
        public void ThreadProcSafe()
        {
            SetText(this.text,this.c);
        }           

        private void SetText(string text,Control c)
        {            
            if (c.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                currentForm.Invoke(d, new object[] { text, c});
            }
            else
            {                
                c.Text = text;                
            }
        }        
    }









domenica 4 aprile 2021

Una newsletter a cui iscriversi

 In questo post vorrei segnalare la newsletter giornaliera di un blog che quasi quotidianamente pubblica articoli sul framework .Net ,  snippet di codice (generalmente .Net) , link a interessanti software gratuiti (tra cui giochi) ed altri argomenti di  interesse per chi programma ma non solo , il sito è http://emanuelemattei.blogspot.com/  . In alto a destra sul blog di Emanuele trovate un text box in cui inserire l'indirizzo email a cui verrà inviata la newsletter .

lunedì 17 febbraio 2020

Conversione da c# a vb.net e vice versa con SharpDevelop

Può capitare di avere del codice sorgente in vb.net e volerlo tradurre in c# o viceversa,per quest'operazione possiamo "provare" la funzione di conversione di SharpDevelop  ,questa è presente nel tool medesimo fino alla versione 4.4 (qui l'installer ed il codice sorgente )  .
Un esempio : creiamo un progetto Windows Application

aggiungiamo un bottone :

facciamo doppio click sul bottone mentre siamo in designer ed aggiungiamo del codice all'handler dell'evento:

selezioniamo il progetto,arriviamo a convert e scegliamo from C# to VB.Net:


dopo la conversione avremo il progetto tradotto in vb.net al cui nome è aggiunto "converted"


andiamo ad aprire il progetto convertito in vb.net e troviamo quanto cercato :


il codice del click è stato tradotto correttamente , :-)  , esistono anche dei traduttori online tra c# e vb .net ma SharpDevelop può essere una scelta utile soprattutto se si tratta di recuperare codice da interi progetti di qualche anno fà che vogliamo modificare.




martedì 23 aprile 2019

WindowsFormsProtector2, a software to defend the source code in .Net

WindowsFormsProtector2 adds, compared to WindowsFormsProtector, the possibility to read the password to encrypt-decrypt your executable from a pendrive,the password must be written in the first line of the text file created by you for this purpose with the Notepad starting from the top left corner, for this functionality you must click on the "Get password from pendrive" button, the password can be written partly using the "virtual" keyboard and partly using the file in the pendrive, this makes more difficult to appropriate the "overall" password,in the test-release phase after reading the password you can remove the pendrive using the "safe removal".

For the features of the program and how to use it you can read the post https://gianmarcocastagna.blogspot.com/2019/04/protect-source-code-in-net.html ,
the software is under the "New Bsd" license, to download the sources you can go here https://sourceforge.net/projects/windowsformsprotector2/



Protect source code in .net

In this post you will find a procedure to add some protection to your c # source related to windows forms applications, under certain conditions the application renders both decompilers and de-obfuscators useless and protects the non-obfuscated source code.

A possible scenario: we have an executable to be tested by others but we don't want to sell it for the moment, so we can encrypt the executable and go to the test machine with our encrypted exe and the software to decrypt it, enter the password to decrypt it and upload it in memory,

 proceed as follows using the WinFormsProtector software:
  1) after selecting the executable file to be protected (with the "choose executable to encrypt" button) and choosing the password and pressing the "choose path file to encrypt" button to choose the path where to save the file, you can then proceed to creation of the encrypted file by pressing the "encrypt file into path" button, the file created is called "encryptedExe.encrypt"
  2) installation of WinFormsProtector on the test machine on which the above encrypted file will be loaded
  3) entering the password used to encrypt the file
  4) selection of the file to be decrypted by pressing the "choose file to decrypt" button
  5) press the "decrypt file, load in ram and run" button



then we load the file in memory and here we decrypt and execute it, in practice we load the Assembly in this way:

Assembly assembly1 = Assembly.Load(exe);

where exe is the array of bytes that makes up the executable
in this way the file that we intend to protect in clear does not exist on the machine but exists only encrypted or in memory,
in the executable file that it intends to protect (the called exe) is necessary to modify the main in this way:
in practice add a Start () method that calls the first Form of your application

namespace Ethical_Hacking
{
    static class Program
   {
     [STAThread]
     static void Main()
    {
       Application.EnableVisualStyles();
       Application.SetCompatibleTextRenderingDefault(false);
     Start();
    }

   public static void Start()
  {
   Form1 f = new Form1();
   f.ShowDialog();
   }

 }
}

in the calling exe we will have:

Assembly assembly1 = Assembly.Load(exe);
var programType1 = assembly1.GetTypes().FirstOrDefault(c => c.Name == "Program");
MethodInfo method1 = programType1.GetMethod("Start", BindingFlags.Public | BindingFlags.Static);
method1.Invoke(null, new object[] { });

that is, the Start () method is invoked.

If the exe file to be protected uses packages you must add these packages in the calling project (executable), for example if we use NewtonSoft.json in the program to be protected also the calling program must have NewtonSoft.Json in its packages.

In the source code you will find two zipped projects: WindowsFormsProtector and Ethical_Hacking, the first is the calling exe the second is the called exe (or the protected one), here the code and the installer: https://sourceforge.net/projects/ winformsprotector /  .
For further info go here .

sabato 23 marzo 2019

WindowsFormsProtector2 , un software per difendere il codice sorgente in .Net

WindowsFormsProtector2 aggiunge , rispetto a WindowsFormsProtector ,la possibilità di leggere anche da una pendrive la password per crittografare-decrittografare il vostro eseguibile , la password va scritta nella prima linea del file di testo da voi creato allo scopo  con BloccoNote partendo dall'angolo in alto a sinistra,per questa funzionalità dovete cliccare sul bottone "Get password from pendrive"  ,la password può essere scritta in parte usando la tastiera "virtuale" ed in parte sul file nella pendrive ,questo rende più difficile appropriarsi della password "complessiva" , in fase di test-rilascio dopo aver letto la password potete rimuovere la chiavetta utilizzando la "rimozione sicura"


Per le caratteristiche del programma e come usarlo potete leggere il post https://gianmarcocastagna.blogspot.com/2018/03/proteggere-il-codice-sorgente-in-net.html
il software è sotto la licenza "New Bsd" ,per scaricare i sorgenti  potete andare qua https://sourceforge.net/projects/windowsformsprotector2/



domenica 10 febbraio 2019

Proteggere il codice sorgente in .net

In questo post trovate illustrata una procedura per aggiungere un po' di protezione ai vostri sorgenti c# relativi ad applicazioni windows forms, in certe condizioni l'applicazione rende inutili sia decompilatori che deoffuscatori e protegge il codice sorgente anche non offuscato,
qui il progetto https://sourceforge.net/projects/winformsprotector/






Uno scenario possibile : abbiamo un eseguibile da far testare da altri ma non vogliamo cederlo per il momento, possiamo quindi crittografare l' eseguibile ed andare sulla macchina di prova con il nostro exe crittografato ed il software per decrittografarlo ovvero inserire la password per decrittografarlo e caricarlo in memoria .

 Si può procedere nel modo seguente mediante il software  WinFormsProtector :
 1) dopo aver selezionato il file eseguibile da proteggere (con il bottone "choose executable to encrypt") e scelta la password e premuto il bottone "choose path file to encrypt" per scegliere il percorso dove salvare il file, si può quindi procedere alla creazione del file crittografato premendo il bottone "encrypt file into path" ,il file creato si chiama "encryptedExe.encrypt"
 2) installazione di WinFormsProtector sulla macchina di test sul quale verrà caricato il file crittografato di cui sopra
 3) inserimento della password utilizzata per crittografare il file
 4) selezione del file da decrittografare premendo il bottone "choose file to decrypt"
 5) premere il pulsante  "decrypt file,load in ram and run"

quindi carichiamo il file in memoria e qui lo decrittografiamo e lo eseguiamo,in pratica carichiamo l'Assembly in questo modo :

Assembly assembly1 = Assembly.Load(exe);
dove exe è l'array di bytes che compone l'eseguibile
in questo modo sulla macchina non esiste il file che intendiamo proteggere in chiaro ma esiste solo crittografato oppure in memoria ,

nel file eseguibile che s' intende proteggere(l'exe chiamato) bisogna modificare il main in questo modo:
in pratica aggiungete un metodo Start() che chiama il primo Form della vostra applicazione

namespace Ethical_Hacking
{
    static class Program
   {
     [STAThread]
     static void Main()
    {
       Application.EnableVisualStyles();
       Application.SetCompatibleTextRenderingDefault(false);
     Start();
    }

//il metodo seguente permette di superare gli eventuali problemi con il metodo SetCompatibleTextRenderingDefault
   public static void Start()
  {
   Form1 f = new Form1();
   f.ShowDialog();
   }

 }
}

nell'exe chiamante avremo quindi :
Assembly assembly1 = Assembly.Load(exe);
var programType1 = assembly1.GetTypes().FirstOrDefault(c => c.Name == "Program");
MethodInfo method1 = programType1.GetMethod("Start", BindingFlags.Public | BindingFlags.Static);
method1.Invoke(null, new object[] { });

ovvero viene invocato il metodo Start() .

Se il file exe da proteggere usa dei riferimenti bisogna aggiungere questi riferimenti nel progetto (eseguibile) chiamante , ad esempio ,se usiamo NewtonSoft.json nel programma da proteggere anche il programma chiamante deve avere NewtonSoft.json nei suoi riferimenti

Nel codice sorgente troverete due progetti zippati :WindowsFormsProtector e Ethical_Hacking ,l primo è l'exe chiamante il secondo è l'exe chiamato (ovvero quello protetto) , qui il codice  : https://sourceforge.net/projects/winformsprotector/

For further info go here 

SourceCodeSafer aggiunta chiusura "automatica" dell'applicazione che fornisce la password da remoto

SourceCodeSafer 4.7 alpha ,  qui   il codice : aggiunta la possibilità di chiudere automaticamente l'applicazione che fornisce la passwo...