MD5加密

using System;
using System.Text;
using System.Globalization;
using System.Security.Cryptography;
class DES
{
//
创建Key
public string GenerateKey()
{
DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
}
// 加密字符串
public string EncryptString(string sInputString, string sKey)
{
byte [] data = Encoding.UTF8.GetBytes(sInputString);
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = DES.CreateEncryptor();
byte [] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
return BitConverter.ToString(result);
}
// 解密字符串
public string DecryptString(string sInputString, string sKey)
{
string [] sInput = sInputString.Split("-".ToCharArray());
byte [] data = new byte[sInput.Length];
for(int i = 0; i < sInput.Length; i++)
{
data[i] = byte.Parse(sInput[i], NumberStyles.HexNumber);
}
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = DES.CreateDecryptor();
byte [] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
return Encoding.UTF8.GetString(result);
}
}
class Test
{
static void Main()
{
DES des = new DES();
string key = des.GenerateKey();
string s0 = "中国软件 - csdn.net";
string s1 = des.EncryptString(s0, key);
string s2 = des.DecryptString(s1, key);
Console.WriteLine("原串: [{0}]", s0);
Console.WriteLine("加密: [{0}]", s1);
Console.WriteLine("解密: [{0}]", s2);
}
}
/* 程序输出:
原串: [中国软件 - csdn.net]
加密: [E8-30-D0-F2-2F-66-52-14-45-9A-DC-C5-85-E7-62-9B-AD-B7-82-CF-A8-0A-59-77]
解密: [中国软件 - csdn.net]
*/

说到大名鼎鼎的MD5算法,稍有经验的程序员都应该听说过,特别是做Web应用程序的开发人员。那什么是MD5呢?MD5是现在使用最广泛的一种哈希算 法,它的作用就是如果哪一天你的网站被人攻破,数据被人窃取,你也不用担心用户信息泄露,因为攻击者看到的所有密码都只是一些没有意义的字符串而已(当然 前提是你已经对密码做过加密处理)。关于于MD5的算法和能力我就不多做介绍了,网上类似的讨论已经多如牛毛,这里只是把.NET中使用MD5算法的方法 做个整理。

使用System.Security.Cryptography命名空间
   在.NET类库的System.Security.Cryptography下,微软给我们提供了直接使用MD5加密的方法,这也是微软C#开发组FAQ中的推荐做法,简简单单的几行代码就让我们的网站安全上升到一个新的级别。首先定义一个方法(以下代码来自C#开发组FAQ):
 
   C3FCD3D76192E4007DFB496CCA67E13B

更简单的调用方法:
   
如果你不想自己定义一个新的方法,这里有另一种更简单的方式,使用HashPasswordForStoringInConfigFile() 方法,该方法位于System.Web.Security命名空间下,函数原型为:

public string CalculateMD5Hash(string input)
{
    
// step 1, calculate MD5 hash from input
     MD5 md5 = System.Security.Cryptography.MD5.Create();
    
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
    
byte[] hash = md5.ComputeHash(inputBytes);

    
// step 2, convert byte array to hex string
     StringBuilder sb =
new StringBuilder();
    
for (int i = 0; i < hash.Length; i++)
     {
         sb.Append(hash[i].ToString(
"X2"));
     }
    
return sb.ToString();
}

   调用方法:

string hash = CalculateMD5Hash("abcdefghijklmnopqrstuvwxyz");

   返回值为一个32位的字符串:

public static string HashPasswordForStoringInConfigFile (
    
string password,
    
string passwordFormat
)

    其中password就是你要加密的密码,passwordFormat表示加密方式,只能取FormsAuthPasswordFormat类型的值, 否则会发生异常,这里有三种选择:"Clear"、"SHA1"、"MD5",分别表示明文显示、使用SHA1算法、使用MD5算法。
    调用方法:

string hash = HashPasswordForStoringInConfigFile("abcdefghijklmnopqrstuvwxyz");

    返回值与上面一样。

给MD5加点“盐”
   
虽然MD5加密很厉害,将 信息泄露的概率降低到了非常小的程度,但我们这些做程序员的具有追求完美的天性,为了达到更高的安全级别,我们还需给MD5加点“盐”。所谓的加“盐”就 是当用户注册填写密码时,让系统产生一个随机值,将这个值与用户密码连接在一起再使用MD5算法进行处理,这样就在很大程度上避免了攻击者通过字符对比得 到特定密码的危险。下面是一段从网上搜集到的实现代码:

public class PasswordHelper
     {
        
public static string CreateSalt(int size)
         {
            
//Generate a cryptographic random number.
             RNGCryptoServiceProvider rng =
new RNGCryptoServiceProvider();
            
byte[] buff = new byte[size];
             rng.GetBytes(buff);

            
// Return a Base64 string representation of the random number.
            
return Convert.ToBase64String(buff);
         }

        
public static string CreatePasswordHash(string pwd, string salt)
        {
            
string saltAndPwd = String.Concat(pwd, salt);
            
string hashedPwd =
             FormsAuthentication.HashPasswordForStoringInConfigFile(
             saltAndPwd,
"sha1");

            
return hashedPwd;
         }

        
public static bool PasswordMatch(string current,string salt,string savedPasswordHash)
         {
            
string currentPasswordHash=CreatePasswordHash(current, salt);
            
return (currentPasswordHash == savedPasswordHash);
         }
     }

 

 

 

 

常用的加密方式

WEB上常用的两种加密方式:MD5和SHA512。
这里分享两个使用的方法


都需要用到.net的以下两个空间
using System.Text
using System.Security.Cryptography


1 MD5
(
不带密钥,任何文本使用MD5加密后的结果是一致的,有安全隐患)

        public string PWDByMd5(string sText)
        
{
            
string pwd = "";
            MD5 md5 = MD5.Create();
            
// 
加密后是一个字节类型的数组 
            byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(sText));
            
// 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 
            for (int i = 0; i < s.Length; i++)
            
{
                
// 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 
                pwd = pwd + s[i].ToString("x");
            }
            
return pwd;
        }


2 SHA512
(
带密钥加密,文本需要在相同密钥的情况下,加密出的结果才会一致)

        public static string PWDBySHA512(
                                          
string sKey,    //
密钥
                                          string sText    //需要加密的文本
                                     )
        
{
            
byte[] HmacKey = System.Text.Encoding.UTF8.GetBytes(sKey);
            
byte[] HmacData = System.Text.Encoding.UTF8.GetBytes(sText);

            HMACSHA512 Hmac = 
new HMACSHA512(HmacKey);

            CryptoStream cs = 
new CryptoStream(Stream.Null, Hmac, CryptoStreamMode.Write);
            cs.Write(HmacData, 0, HmacData.Length);
            cs.Close();

            
byte[] Result = Hmac.Hash;

            
return Convert.ToBase64String(Result);  //返回长度为28字节字符串
        }

以上内容是转贴的…………呵呵,其实我的程序里面用到的比较简单:

 

/// <summary>
  /// 比對明碼密碼和加密密碼-Md5
  /// </summary>
  /// <param name="TxtPassword">明碼</param>
  /// <param name="EncPassword">密碼</param>
  /// <returns>bool (true - 符合; false - 不符合)</returns>
  public static bool ComparePassword(String TxtPassword,String EncPassword) {
   try {
    bool retState = false;
    try {
     String aenPasswd = EnCodeString(TxtPassword);
     if(aenPasswd.Equals(EncPassword)) {
      retState = true;
     }
    }
    catch(EZFException ezfex) {
     throw ezfex;
    }

    return retState;

   } catch (EZFException ezfEx) {
    throw ezfEx;
    
   } catch (Exception ex) {
    string sErrorMessage = "Cipher.ComparePassword() Error";
    EZFException ezfEx = new EZFException(sErrorMessage, ex, EZFExceptionConst.METHOD_ExNotExpect);
    
    throw ezfEx; 
   }  
  }

  /// <summary>
  /// 取得加密過密碼-Md5
  /// </summary>
  /// <param name="Password">明碼</param>
  /// <returns>加密過密碼(string)</returns>
  public static string EnCodeString(string Password) {
   try {
    MD5 md5 = new MD5CryptoServiceProvider();

    byte[] passwd = md5.ComputeHash(System.Text.Encoding.Unicode.GetBytes(Password));
    byte[] passwd2 = md5.ComputeHash(passwd,3,6);
    
    System.Text.StringBuilder sb = new StringBuilder();
    foreach(byte mbye in passwd) {
     sb.Append(mbye.ToString("x2")); 
    }
    
    foreach(byte mbye in passwd2) {
     sb.Append(mbye.ToString("x2")); 
    }

    return sb.ToString();
   } catch (EZFException ezfEx) {
    throw ezfEx;
    
   } catch (Exception ex) {
    string sErrorMessage = "Cipher.EnCodeString() Error";
    EZFException ezfEx = new EZFException(sErrorMessage, ex,                                  EZFExceptionConst.METHOD_ExNotExpect);
    
    throw ezfEx; 
   }  
  }

 

posted on 2009-07-06 16:29  风叶  阅读(4279)  评论(0编辑  收藏  举报