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();
}
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:
Posta un commento