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();
    }

Nessun commento: