venerdì 4 marzo 2011

Come memorizzare le password

Recentemente mi sono posto questo problema:
qual'è il metodo migliore per memorizzare una password in un database, evitando ovviamente di metterla in chiaro?
A tale domanda la mia prima risposta è stata quella di utilizzare la funzione di hashing della stringa, presente praticamente in ogni liunguaggio di programmazione "attuale" (ho diretta esperienza in Java e .NET).
Questa scelta però non è vincente in quanto l'hash non garantisce la "portabilità" tra tecnologie diverse (la funzione di hashing di Java e C# sono diverse!) ma nemmeno tra versioni diverse della stessa tecnologia: infatti non si garantisce che tale algoritmo di hashing non venga cambiato in future versioni dello stesso linguaggio.

A mio avvio quindi la scelta migliore è quella di usare uno degli algoritmi di generazione del digest come può essere l'SHA-1 o qualsiasi altro algoritmo superiore.
Riporto sotto il codice per generare tale digest nei due linguaggi che utilizzo di norma.

 C#.NET:


        ///

        /// Create Digest of one string
        ///

        ///

        ///
        public static byte[] GetDigest(String arg)
        {
            System.Security.Cryptography.SHA1 sha = new System.Security.Cryptography.SHA1Managed();
            ASCIIEncoding ae = new ASCIIEncoding();
            byte[] data = ae.GetBytes(arg);
            byte[] digest = sha.ComputeHash(data);
            return digest;
        }

        ///

        /// COnverts an array of bytes in the UNICODE value of the string.
        ///

        ///
        ///
        public static string GetAsString(byte[] bytes)
        {
            StringBuilder s = new StringBuilder();
            int length = bytes.Length;
            for (int n = 0; n < length; n++)
            {
                s.Append(Convert.ToChar(bytes[n]));
            }
            return s.ToString();
        }


JAVA:
    public byte[] getDigest(String arg) throws java.security.NoSuchAlgorithmException, UnsupportedEncodingException {
        java.security.MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
        digest.reset();
        return digest.digest(arg.getBytes("UTF-8"));
    }

    public static String GetAsString(byte[] bytes) {
        StringBuilder s = new StringBuilder();
        int length = bytes.length;
        for (int n = 0; n < length; n++) {
            s.append((char) (bytes[n] & 0xff));
        }
        return s.toString();
    }

domenica 30 gennaio 2011

Efficienza vs efficacia

Spesso nel mio lavoro mi capita di dover pensare se la soluzione che ho in mente e che chiedo alla direzione di (far) realizzare, sia proprio la soluzione migliore in quell'istante per l'azienda, cercando di trovare il giusto compromesso tra soluzioni formalmente curate, frutto di architetture flessibili e manutenibili,... contro soluzioni veloci, che puntano alla risoluzione del mero problema del cliente, il così detto "quick and dirty"
La teoria della Qualità, del sistema Toyota non lascia alcun dubbio sulla strada da seguire: quello che bisogna fare è risolvere il problema, nel più breve tempo possibile, tanto da sostenere che, se nel giro di una settimana (la famosa Settimana Kaizen) non si riesce a trovare, e implementare una soluzione, significa che si sta sbagliando strategia.

La regola d'oro sembra quindi essere: puntare all'efficacia piuttosto che all'efficienza.

Ho sempre sostenuto che questa logica di miglioramento a piccoli passi, atta a risolvere velocemente il mero problema del cliente,  non fosse applicabile ad ogni realtà, ma solo a quelle che hanno superato una certa "massa critica" nell'organizzazione e standardizzazione aziendale, massa critica che deve essere raggiunta a
suon di pesanti investimenti.

Questo mio convincimento porta anche a ripensare al valore dell'efficienza che deve essere uguale o forse maggiore a quella dell'efficacia.
Mi piace vedere l'efficacia come il fine che deve obbligatoriamente essere raggiunto con un processo efficiente, ovvero "di qualità" che riesca a garantire flessibilità e manutenibilità nel tempo.

SQL Server, IIS 7 e Windows Server 2008

Che user viene utilizzato per far girare web app ASP.NET su IIS 7? E più concretamente, qual'è lo user con cui una web app si collega a SQL Server? In pratica, se SQL Server si trova sulla stessa macchina su cui gira IIS 7 e si volesse utilizzare l'integrated security evitando di mettere in chiaro una password nella configurazione, a quale user bisognerebbe garantire l'accesso al DB (modulando l'autorizzazione minima necessaria per fare tutto il lavoro)? La risposta è: IIS_IUSR.
Tale discorso vale anche se SQL Server e IIS 7 si trovassero su due macchine differenti, entrambe sotto lo stesso dominio.

IIS 7 su sistema x64

In questi giorni ho scoperto che esistono due moduli distinti asp.net per IIS: oltre a quello standard ne esiste uno specifico per macchine a 64 bit.

Volendo pubblicare una web app in ASP.NET su un tale sistema a 64 bit bisogna ricordarsi di agganciare eventuali estensioni particolari (oltre alle solite *.aspx) ad entrambi i moduli, pena l'impossibilità di visualizzare tali   pagine.

lunedì 18 ottobre 2010

Considerazioni su SQL

Credo che concentrare in SQL nelle SP una grossa quantità di codice sia controproducente. Bisogna suddividere molto, in modo che il controllo rimanga nel codice e sfruttare tutto ciò che deriva dalla programmazione a oggetti, senza considerare i nuovi strumenti evoluti (LINQ o HIBERNATE).

mercoledì 11 novembre 2009

Rendere SQL Server raggiungibile

Ecco i passaggi per configurare un server in modo che sql server sia raggiungibile da remoto.
1) abilitare il firewall sulla porta 1433.
2) abilitare il firewall sulla porta 1434 udp
3) In Sql server configuration manager abilitare il TCP/IP.
4) abilitare TCP port su 1433 e togliere da dynamic port mettere stringa nulla.
(5) abilitare IP Address /Enabled nelle proprietà del protocollo TCP/IP in network config e Protocols, attivare TCP/IP)
6) Controllare se in Client Protocols il TCP/IP ha il default port su 1433
7) attivare sql server e sql browser.

Attenzione: E' fondamentale attivare anche il SQL Browser PER LA PRIMA CONNESSIONE; poi si può spegnere senza problemi.

venerdì 6 novembre 2009

Stanotte ho fatto una scoperta sensazionale.
Google mette a disposizione uno strumento per fare i grafici on line.
Il concetto è semplice: giocando con i parametri in query string di un loro sito, si possono creare on-the-fly immagini che riproducono il grafico richiesto.