背景介绍
在把重要的数据直接存储到数据库中的时候,可能有一些不法份子通过漏洞来直接访问到我们的数据库,那么就可以轻易而据的盗取到我们的用户名和密码。
在平常生活中,估计我们大多数人都在用同一个邮箱来注册各个网站,一旦某个网站被泄露后,那么我们所有网站的隐私都会被泄露。
以上也在告诉我们,不要把密码明文保存。
定义
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
MD5算法是一种散列算法,不是一种加密算法,任何长度的任意内容都可以用MD5计算出散列值。
MD5算法不可逆,也就是只能得到内容对应的MD5值,无法由MD5值反推内容。对于不同的内容产生不同的MD5值得概率非常非常的低。
Passwod字段中保存用户输入密码的MD5值,这样系统管理员、黑客也不知道用户的密码是什么,也就避免了用户的其他系统密码被利用的问题。
判断密码正确性的方法:计算用户输入的密码的MD5值,与数据库存储的MD5值进行比较,如果相等则认为密码正确。这也是为什么很多网站只有密码重置,没有找回原密码功能。 介绍工具:MD5加密工具
如果用上面的工具的话,加密后的密码文本如下
密码 | 加密后 |
123 | 202cb962ac59075b964b07152d234b70 |
456 | 250cf8b51c773f3f8dc8b4be867a9a02 |
如果我们在自己的数据库中保存加密后的密码后,会大大的提高我们系统的安全,因为即使出现漏洞得到密码后,黑客也反推不出原密码,除非一次次的根据原密码推算得到,待会我们会有妙招解决。
MD5在.NET中的应用
在做机房收费系统的时候,也想过采取加密来保存用户的密码,其实原理很简单,通过一个转变函数来加密用户名和密码,然后保存的数据库中。当用户登陆的时候,在把用户输入的信息加密得到的字符串与数据库中保存的密码核对即可。
MD5函数如下
''' <summary> ''' MD5算法 ''' </summary> ''' <param name="sDataIn">传入的字符串</param> ''' <returns>返回字符串类型</returns> ''' <remarks></remarks> Public Function GetMD5(ByVal sDataIn As String) As String Dim md5 As New MD5CryptoServiceProvider Dim bytValue As Byte() Dim bytHash As Byte() bytValue = System.Text.Encoding.UTF8.GetBytes(sDataIn) bytHash = md5.ComputeHash(bytValue) md5.Clear() Dim sTemp As String = "" For i = 0 To bytHash.Length - 1 sTemp = sTemp + bytHash(i).ToString("X").PadLeft(2, "0") Next Return sTemp.ToLower() End Function
注意:可以把此函数写到公共的类中,以后用的时候,直接调用即可。
MD5加盐算法
又有人质疑了,如果黑客通过漏洞得到我们的数据库后,虽然反推不出用户的密码和用户名,但是如果黑客们经得住寂寞,反复的通过MD5加密工具来猜测,然后与数据库中的数据进行核对的话,还是有一定几率得到用户名的。不怕,俗话说的好:魔高一尺,道高一丈。我们也可以解决这个问题,这就是所谓的加盐操作。
原理很简单,当保存用户的时候,我们略微动一下手脚。如下
用户名 | 加密后 |
123 | MD5(123+,,a) |
456 | MD5(456+,,a) |
如上面的表格所示,“,,a”就是我们所说的盐操作,就是在用户名后加入字符串然后再MD5加密,这样即使黑客反推出用户名是123,,a后,也推算不错123,怎么样这招高明吧!
小结:
安全是个大问题,在做机房收费系统的时候,也在时刻考虑如何来保证用户名的安全,终于查到了MD5这个工具,如果以后再遇到类似的问题后,也就容易的多了,像支付宝啊等网站也是利用MD5来加密用户密码的,只不过定期的通知用户来修改密码+手机验证来使安全系统进一步的提高。
原文:http://blog.csdn.net/luckyzhoustar/article/details/29590083