本文PDF下载(转载请注明出处)
近来在项目中用到了MD5加密技术,用来将用户的登录密码加密后,存入数据库保存。例如:用户输入“123456”,加密后的字符串即为“e10adc3949ba59abbe56e057f20f883e”。
注意,加密后的字符串是不可逆的,即遗失密码后只能重置,不能解密出实际密码。下面介绍MD5的一些知识:
历史与密码学
弱点
|
下面的代码展示了如何将一个字符串使用MD5加密:
// 计算字符串的 MD5 哈希值,并将该哈希作为 32 字符的十六进制格式字符串返回。 public string GetMD5Hash(string input) { // 创建一个MD5CryptoServiceProvider对象的新实例。 MD5 md5Hasher = MD5.Create(); // 将输入的字符串转换为一个字节数组并计算哈希值。 byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input)); //创建一个StringBuilder对象,用来收集字节数组中的每一个字节,然后创建一个字符串。 StringBuilder sBuilder = new StringBuilder(); // 遍历字节数组,将每一个字节转换为十六进制字符串后,追加到StringBuilder实例的结尾 for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } // 返回一个十六进制字符串 return sBuilder.ToString(); }
下面的代码展示了一个输入字符串经MD5转换后,是否等同于一个已加密的哈希值:
// 验证输入字符串经MD5转换后,是否等同于一个哈希值 public bool VerifyMd5Hash(string input, string hash) { // 将输入字符串MD5加密 string hashOfInput = GetMD5Hash(input); // 创建一个StringComparer实例来比较两个哈希值 // StringComparer.OrdinalIgnoreCase:获取 StringComparer 对象 // ,该对象执行不区分大小写的序号字符串比较。 StringComparer comparer = StringComparer.OrdinalIgnoreCase; return comparer.Compare(hashOfInput, hash) == 0; }
在上述两段代码中,GetMD5Hash方法常用于用户注册,VerifyMd5Hash方法常用于用户登录。
下面,介绍下StringComparer对象。它表示一种字符串比较操作,该操作使用特定的大小写以及基于区域性的比较规则或序号比较规则。它有6个常用静态属性可以获得实例:
名称 |
说明 |
CurrentCulture |
该对象使用当前区域性的单词比较规则执行区分大小写的字符串比较。 |
CurrentCultureIgnoreCase |
该对象使用当前区域性的单词比较规则执行不区分大小写的字符串比较。 |
InvariantCulture |
该对象使用固定区域性的单词比较规则执行区分大小写的字符串比较。 |
InvariantCultureIgnoreCase |
该对象使用固定区域性的单词比较规则执行不区分大小写的字符串比较。 |
Ordinal |
该对象执行区分大小写的序号字符串比较。 |
OrdinalIgnoreCase |
该对象执行不区分大小写的序号字符串比较。 |
然后,调用StringComparer实例的Compare方法,即可使用指定特性来比较两个字符串是否相等了。