Simple and efficient password encryption in .NET
Four years ago, I was working as a developer in a company that made custom content management systems. We offered back-ups of the databases to our customers on a monthly basis, but in those databases we stored all the users’ login information. The customer was of course happy about getting all the passwords, but I saw that as a severe security breach.
So, I convinced my boss to let me implement password encryption using a very simple but powerful tool – one way encryption. One way encryption means that you can encrypt a value but you cannot decrypt it again, so no one was able to retrieve the actual passwords.
This is the simple method I used for encryption.
using System.Text;
using System.Security.Cryptography;
/// <summary>
/// Encrypts
a string that cannot be decrypted. It is encrypted one-way in order
/// to
make it impossible to decrypt. The purpose of this mehod could be to hide
/// password
information from potential hackers and even the system administrators.
/// </summary>
/// <param
name="plainMessage">The
string you want to encrypt.</param>
/// <returns>A
MD5 hashed byte array as a base64 string.</returns>
public string Encrypt(string plainMessage)
{
using (MD5CryptoServiceProvider md5Hasher
= new MD5CryptoServiceProvider())
{
byte[]
hashedDataBytes = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(plainMessage));
return Convert.ToBase64String(hashedDataBytes);
}
}
Example of use
The use of this method is pretty simple. The password field in the database contained the encrypted password and every time a user tried to authenticate I would encrypt the password and query the database using the encrypted string. This is a dummy method that does just that.
private bool Login(string password)
{
string encryptedPassword
= Encrypt(password);
//
Query database for encrypted password
return CanAuthenticate(encryptedPassword);
}
If I pass my own name to the Encrypt method this would be the result:
Encrypt("
Now the database was filled with totally unreadable values that effectively shielded the right passwords.
UPDATE septemper 12
As some of the comments point out, the MD5 algorithm is not secure enough. So, I wrote a new Encrypt method using the SHA256 algorithm.